?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
本節(jié)中的信息說明在 Docker 默認(rèn)網(wǎng)橋中配置容器 DNS。這是一個(gè)在安裝 Docker 時(shí)自動(dòng)創(chuàng)建名為bridge
的bridge
網(wǎng)絡(luò)。
注意:通過 Docker 網(wǎng)絡(luò)功能,您可以創(chuàng)建除默認(rèn)網(wǎng)橋以外的用戶定義網(wǎng)絡(luò)。有關(guān)用戶定義網(wǎng)絡(luò)中 DNS 配置的更多信息,請(qǐng)參閱 Docker Embedded DNS 部分。
Docker 如何為每個(gè)容器提供主機(jī)名和 DNS 配置,而不必使用內(nèi)部寫入的主機(jī)名來構(gòu)建自定義映像?它的訣竅是/etc
用虛擬文件覆蓋容器內(nèi)的三個(gè)關(guān)鍵文件,以便在其中寫入新的信息。您可以通過mount
在容器中運(yùn)行來看到這一點(diǎn):
root@f38c87f2a42d:/# mount... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ......
這種安排允許 Docker 做一些聰明的事情,例如resolv.conf
當(dāng)主機(jī)在稍后通過
DHCP 接收新的配置時(shí),在所有容器中保持最新狀態(tài)。Docker 如何在容器中維護(hù)這些文件的確切細(xì)節(jié)可以從一個(gè) Docker 版本更改為下一個(gè),因此您應(yīng)該保留文件本身,并改為使用以下 Docker 選項(xiàng)。
四個(gè)不同的選項(xiàng)影響容器域名服務(wù)。
-h HOSTNAME或--hostname = HOSTNAME | 設(shè)置容器知道自己的主機(jī)名。這寫入/ etc / hostname,寫入/ etc / hosts 作為容器的面向主機(jī)的IP地址的名稱,并且是容器內(nèi)部的/ bin / bash 將在其提示符內(nèi)顯示的名稱。但主機(jī)名不容易從容器外看到。它不會(huì)出現(xiàn)在 docker ps 中,也不會(huì)出現(xiàn)在任何其他容器的/ etc / hosts 文件中。 |
---|---|
--link = CONTAINER_NAME或 ID:ALIAS | 在運(yùn)行容器時(shí)使用此選項(xiàng)會(huì)為新容器的/ etc / hosts 添加一個(gè)名為 ALIAS 的額外條目,該條目指向由 C ONTAINER_NAME_or_ID 標(biāo)識(shí)的容器的 IP 地址。這使新容器內(nèi)的進(jìn)程連接到主機(jī)名稱 ALIAS,而無需知道其 IP。下面將更詳細(xì)地討論--link =選項(xiàng)。由于 Docker 可能會(huì)在重新啟動(dòng)時(shí)為鏈接的容器分配不同的IP地址,因此 Docker 會(huì)更新收件人容器的/ etc / hosts 文件中的 ALIAS 條目。 |
--dns = IP_ADDRESS ... | 將作為域名服務(wù)器行添加的IP地址設(shè)置為容器的/etc/resolv.conf 文件。容器中的進(jìn)程在遇到不在/ etc / hosts中的主機(jī)名時(shí),將連接到端口53上的這些 IP 地址,以查找名稱解析服務(wù)。 |
--dns-search=DOMAIN... | 通過在容器的/etc/resolv.conf 中寫入搜索行來設(shè)置在容器內(nèi)部使用裸露的不合格主機(jī)名時(shí)搜索的域名。例如,當(dāng)容器進(jìn)程嘗試訪問主機(jī)并設(shè)置搜索域 example.com 時(shí),DNS 邏輯不僅會(huì)查找主機(jī),還會(huì)查找 host.example.com。使用--dns-search =。如果你不想設(shè)置搜索域。 |
--dns-opt=OPTION... | 通過將選項(xiàng)行寫入容器的/etc/resolv.conf 來設(shè)置 DNS 解析器使用的選項(xiàng)。有關(guān)有效選項(xiàng)的列表,請(qǐng)參閱 resolv.conf 的文檔 |
關(guān)于 DNS 設(shè)置,在沒有的--dns=IP_ADDRESS...
,--dns-search=DOMAIN...
或--dns-opt=OPTION...
選項(xiàng),Docker 每個(gè)容器的/etc/resolv.conf
模樣/etc/resolv.conf
主機(jī)(其中的docker
守護(hù)進(jìn)程(daemon)運(yùn)行)。在創(chuàng)建容器時(shí)/etc/resolv.conf
,守護(hù)進(jìn)程(daemon)從主機(jī)的原始文件中過濾掉所有本地主機(jī) IP 地址nameserver
條目。
過濾是必要的,因?yàn)橹鳈C(jī)上的所有本地主機(jī)地址都無法從容器的網(wǎng)絡(luò)訪問。在過濾之后,如果nameserver
容器/etc/resolv.conf
文件中沒有剩余條目,守護(hù)進(jìn)程將公共 Google DNS 名稱服務(wù)器(8.8.8.8和8.8.4.4)添加到容器的 DNS 配置中。如果守護(hù)程序啟用了 IPv6,則還將添加公共 IPv6 Google DNS 名稱服務(wù)器(2001:4860:4860 :: 8888和2001:4860:4860 :: 8844)。
注意:如果您需要訪問主機(jī)的本地主機(jī)解析程序,則必須修改主機(jī)上的 DNS 服務(wù)以偵聽可從容器內(nèi)訪問的非本地主機(jī)地址。
您可能想知道主機(jī)/etc/resolv.conf
文件更改時(shí)會(huì)發(fā)生什么。docker
守護(hù)進(jìn)程(daemon)有一個(gè)文件改變通知活躍,將監(jiān)視更改到主機(jī)的 DNS 配置。
注意:文件更改通知程序依賴于 Linux 內(nèi)核的 inotify 功能。由于此功能當(dāng)前與覆蓋文件系統(tǒng)驅(qū)動(dòng)程序不兼容,因此使用“覆蓋”的 Docker 守護(hù)程序?qū)o法利用
/etc/resolv.conf
自動(dòng)更新功能。
當(dāng)主機(jī)文件更改時(shí),resolv.conf
與主機(jī)匹配的所有停止的容器將立即更新為此最新的主機(jī)配置。在主機(jī)配置發(fā)生變化時(shí)運(yùn)行的容器需要停下來,并且由于缺乏設(shè)施而開始采用主機(jī)更改,以確保resolv.conf
在容器運(yùn)行時(shí)對(duì)文件進(jìn)行原子寫入。如果容器resolv.conf
從缺省配置啟動(dòng)后已經(jīng)被編輯,則不會(huì)嘗試替換,因?yàn)樗鼤?huì)覆蓋容器執(zhí)行的更改。如果選項(xiàng)(--dns
,,--dns-search
或--dns-opt
)已用于修改默認(rèn)主機(jī)配置,則更新主機(jī)的更換/etc/resolv.conf
也不會(huì)發(fā)生。
注意:對(duì)于
/etc/resolv.conf
在 Docker 1.5.0中實(shí)現(xiàn)更新功能之前創(chuàng)建的容器:當(dāng)主機(jī)文件發(fā)生更改時(shí),這些容器將不會(huì)收到更新resolv.conf
。只有使用 Docker 1.5.0或更高版本創(chuàng)建的容器才會(huì)使用此自動(dòng)更新功能。