Docker容器內DNS異常故障處理

容器DNS異常處理

問題詳情

最近公司開發使用的一個 maven 倉庫(nexus) 說同步阿里雲Maven 源失敗,這個倉庫是使用容器部署的。

排查問題

  1. 首先就是登陸到容器, ping www.baidu.com 發現網絡不可達,確定是容器網絡不能訪問外網。
  2. 第二步查看容器的網絡模式,使用的橋接網絡。
  3. 查看對應的主機,主機是否訪問外網,查詢之後是可以訪問的。
  4. 繼續登陸到容器, 通過 ping IP 看網絡是否可達, 發現IP 可達,就基本是定位到是 DNS 的問題了。
  5. 查看容器內部的 DNS, 發現設置的 DNS 是ping 不通的,詢問網絡工程師,這兩個 DNS IP 已經不能使用了。需要使用新的DNS 對應的IP。

問題解決

既然找到了問題,是容器 DNS 的問題,那麼就需要更改,DNS ,我進入到 容器內部,進行更改文件 /etc/resolv.conf. 但是我進行編輯這個文件 是不可寫,只能讀。

查看下Docker 的官方文檔,官方文檔寫到

By default, a container inherits the DNS settings of the host, as defined in the /etc/resolv.conf configuration file. Containers that use the default bridge network get a copy of this file, whereas containers that use a custom network use Docker’s embedded DNS server, which forwards external DNS lookups to the DNS servers configured on the host.

Custom hosts defined in /etc/hosts are not inherited. To pass additional hosts into your container, refer to add entries to container hosts file in the docker run reference documentation. You can override these settings on a per-container basis.
翻譯大概意思就是:
默認情況下, 容器會繼承容器所在的宿主機的DNS配置(/etc/resolv.conf ), 如果使用的是橋接網絡,將會基於宿主機的(/etc/resolv.conf) 創建副本,
自定義網絡的容器將使用 Docker’s embedded DNS server,  自定義的網絡將不會繼承 /etc/hosts 

解決辦法,應該是宿主機的 /etc/resolv.conf 文件發生了變動,然後對應的容器沒有獲取到最新的配置,重啓下對應的 容器,讓容器獲取到最新的 DNS 配置即可。

擴展

擴展中的內容未驗證。 我簡單驗證了下,在宿主機更改了 /etc/resolv.conf ,對應的虛擬機沒有發生改變。

https://cloud.tencent.com/developer/article/1083218

當創建容器的 /etc/resolv.conf ,Docker daemon會從主機的原始文件中過濾掉所有localhost IP地址 nameserver 條目。

過濾是必要的,因爲主機上的所有localhost地址都不可從容器的網絡中訪問。 過濾之後,如果容器的 /etc/resolv.conf 文件中沒有更多的 nameserver 條目

您可能會想知道宿主機的 /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及以上版本創建的容器才能使用此自動更新功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章