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