Docker系列教程17-預設bridge網路中配置DNS

weixin_33912445發表於2018-05-07

本節描述如何在Docker預設網橋中配置容器DNS。 當您安裝Docker時,就會自動建立一個名為bridge 的橋接網路。

注意Docker網路功能 允許您建立除預設網橋之外的使用者自定義網路。 有關使用者自定義網路中DNS配置的更多資訊,請參閱Docker嵌入式DNS 部分。

Docker如何為每個容器提供主機名和DNS配置,而無需在構建自定義Docker映象時在內部寫入主機名?它的訣竅是利用可以寫入新資訊的虛擬檔案,在容器內覆蓋三個關鍵的/etc 檔案。 你可以通過在一個容器中執行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可以讓宿主機在稍後通過DHCP接收到新的配置後,使所有容器中的resolv.conf 保持最新狀態。 Docker在容器中維護這些檔案的具體細節可能會可能會隨著Docker版本的演進而改變,因此您不該自己管理/etc檔案,而應該用以下Docker選項。

四個不同的選項會影響容器域名服務。

引數 描述
-h HOSTNAME or --hostname=HOSTNAME 設定容器的主機名。 該設定的值將會被寫入/etc/hostname ;寫入/etc/hosts 作為容器的面向主機IP地址的名稱(筆者按:在/etc/hosts裡新增一條記錄,IP是宿主機可以訪問的IP,host就是你設定的host),並且是容器內部/bin/bash 在其提示符下顯示的名稱。 但主機名不容易從容器外面看到。 它不會出現在docker ps 或任何其他容器的/etc/hosts 檔案中。
--link=CONTAINER_NAMEor ID:ALIAS run 容器時使用此選項為新容器的/etc/hosts 新增了一個名為ALIAS的額外條目,指向由CONTAINER_NAME_or_ID標識的CONTAINER_NAME_or_ID的IP地址。這使得新容器內的程式可以連線到主機名ALIAS 而不必知道其IP。 --link=選項將在下面進行更詳細的討論。 因為Docker可以在重新啟動時為連結的容器分配不同的IP地址,Docker會更新收件人容器的/etc/hosts 檔案中的ALIAS條目。
--dns=IP_ADDRESS... 在容器的/etc/resolv.conf檔案新增nameserver 行,IP地址為指定IP。 容器中的程式在如果需要訪問/etc/hosts 裡的主機名,就會連線到這些IP地址的53埠,尋找名稱解析服務。
--dns-search=DOMAIN... 通過在容器的/etc/resolv.conf寫入search 行,在容器內使用裸不合格的主機名時搜尋的域名。 當容器程式嘗試訪問host 並且搜尋域example.com 被設定時,例如,DNS邏輯不僅將查詢host ,還將查詢host.example.com 。使用--dns-search=. 如果您不想設定搜尋域。
--dns-opt=OPTION... 通過將options 行寫入容器的/etc/resolv.conf 設定DNS解析器使用的選項。有關有效選項的列表,請參閱resolv.conf文件

在沒有--dns=IP_ADDRESS...--dns-search=DOMAIN...--dns-opt=OPTION...選項的情況下,Docker使每個容器的/etc/resolv.conf 看起來像宿主機的/etc/resolv.conf 。當建立容器的/etc/resolv.conf ,Docker daemon會從主機的原始檔案中過濾掉所有localhost IP地址nameserver 條目。

過濾是必要的,因為主機上的所有localhost地址都不可從容器的網路中訪問。 過濾之後,如果容器的/etc/resolv.conf 檔案中沒有更多的nameserver 條目,Docker daemon會將Google DNS名稱伺服器(8.8.8.8和8.8.4.4)新增到容器的DNS配置中。 如果守護程式啟用了IPv6,則也會新增公共IPv6 Google DNS名稱伺服器(2001:4860:4860::8888 和 2001:4860:4860::8844)。

注意 :如果您需要訪問主機的localhost解析器,則必須在主機上修改DNS服務,以便偵聽從容器內可訪問的non-localhost地址。

您可能會想知道宿主機的/etc/resolv.conf 檔案發生了什麼變化。 docker daemon 有一個檔案更改通知程式,它將監視主機DNS配置的更改。

注意 :檔案更改通知程式依賴於Linux核心的inotify功能。由於此功能目前與overlay檔案系統驅動不相容,因此使用“overlay”的Docker daemon將無法利用/etc/resolv.conf 自動更新的功能。

當宿主機檔案更改時,所有resolv.conf 與主機匹配的停止的容器將立即更新到最新的主機配置。 當宿主機配置更改時,執行的容器將需要停止並開始接收主機更改,這是由於缺少裝置,以確保在容器執行時對resolv.conf 檔案的原子寫入。 如果容器修改了預設的resolv.conf 檔案,則不會替換該檔案,因為如果替換,將會覆蓋容器執行的更改。 如果選項( --dns--dns-search--dns-opt )已被用於修改預設的主機配置,則更換主機的/etc/resolv.conf 也不會發生。

注意 :對於在Docker 1.5.0中實現/etc/resolv.conf 更新功能之前建立的容器:當主機resolv.conf檔案更改時,這些容器將不會收到更新。 只有使用Docker 1.5.0及以上版本建立的容器才能使用此自動更新功能。

英文原文

https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/

擴充閱讀

Docker儲存驅動的選擇:https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#docker-ce

本文首發

http://www.itmuch.com/docker/18-docker-user-network-embeded-dns/

乾貨分享

3865516-e702e5f8c238701f.png
全是乾貨

相關文章