解決docker容器設(shè)置DNS不生效的問題
docker容器設(shè)置DNS不生效問題
設(shè)定DNS的方法
先來說一下 docker run 和 docker-compose 指定 dns 的方法。
1、docker run 命令 設(shè)置 dns
docker run --dns=8.8.8.8
2、docker-compose.yml 文件中 設(shè)置dns
version: '3.9'
services:
coredns:
image: hello:1.0.0
container_name: hello
dns: 8.8.8.8通過以上兩種方式配置 dns 后,你會(huì)發(fā)現(xiàn) docker run方式設(shè)定的有效,docker-compose 方式設(shè)定的 dns 無效。
主要表現(xiàn)在容器中 /etc/resolv.conf 中的地址沒有變化,修改文件重啟后仍不生效。
不生效原因分析
容器的 /etc/hosts 、hostname 等文件 都是默認(rèn)掛載宿主機(jī)里的配置的,命令行進(jìn)入容器后,在容器中使用 mount 命令可以看到。
一般容器中默認(rèn)的 nameserver 就是 127.0.0.11 。
解決方案
1、直接使用 volume 設(shè)置重新映射 /etc/resolv.conf 文件到宿主機(jī)的位置。既在宿主機(jī)上自定義一個(gè)文件(或者直接使用宿主機(jī)的 /etc/resolv.conf),掛載到容器內(nèi)的 /etc/resolv.conf。
2、在 /etc/docker/daemon.json 中配置所有 docker 容器的缺省 dns(這里配置的 dns 僅對(duì) docker run 默認(rèn)網(wǎng)絡(luò)啟動(dòng)的走 docker0 網(wǎng)橋的容器有效)。
3、在 docker-compose 中配置參數(shù) network_mode: bridge 的容器。注意設(shè)置了該參數(shù)的容器不能再用 networks 配置額外的網(wǎng)絡(luò)信息。
官方說明釋義
參考官方文檔說明,意思是如果使用默認(rèn)的 docker0 網(wǎng)絡(luò)的容器,dns 配置會(huì)生效,但是使用自定義網(wǎng)絡(luò)話(docker-compose 默認(rèn)就創(chuàng)建新的自定義網(wǎng)絡(luò)),就不會(huì)用宿主機(jī)的 dns文件,從而不能覆蓋 resolv.conf 配置,既不能生效。
而使用 docker run 默認(rèn)使用的是橋接模式下的 docker0 網(wǎng)橋,所以生效。docker-compose 文件啟動(dòng)會(huì)創(chuàng)建新的網(wǎng)橋,所以不生效。
結(jié)合上述說明,如果想讓 docker-compose.yml 中的容器配置 dns 生效,就需要為容器設(shè)置 network_mode: bridge 后再設(shè)置 dns,這樣對(duì)應(yīng)的容器 dns 生效(設(shè)定 network_mode: bridge 的容器可以通過相關(guān)命令查看它走的是 docker0 網(wǎng)橋)。
最后,因?yàn)?docker-compose 中 network_mode: bridge 和 networks,兩個(gè)配置只能二選一,加上在 docker-compose 中為容器設(shè)定固定IP 又需要通過 networks 來配置,所以在 docker-compose 中如果你選擇 network_mode: bridge 就之能放棄為容器設(shè)置固定 IP 的需求。
相關(guān)連接:
- https://github.com/docker/compose/issues/2847
- https://docs.docker.com/config/containers/container-networking/
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在云服務(wù)器上基于docker安裝jenkins的實(shí)現(xiàn)步驟
本文主要介紹了在云服務(wù)器上基于docker安裝jenkins的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
docker和docker-compose的版本對(duì)應(yīng)關(guān)系的實(shí)現(xiàn)
本文主要介紹了docker和docker-compose的版本對(duì)應(yīng)關(guān)系的實(shí)現(xiàn),兩者雖非強(qiáng)制綁定,但新版本docker-compose可能依賴更高版本Docker引擎的API,具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06
部署Docker Registry并配置認(rèn)證登錄教程
DockerRegistry是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的無狀態(tài)、高度可擴(kuò)展的服務(wù)器側(cè)應(yīng)用程序,在內(nèi)網(wǎng)環(huán)境下,可以使用DockerRegistry來解決k8s集群的鏡像拉取問題,如果需要開啟認(rèn)證功能,可以直接看配置DockerRegistry認(rèn)證搭建2025-12-12
使用Docker的NFS-Ganesha鏡像搭建nfs服務(wù)器的詳細(xì)過程
這篇文章主要介紹了使用Docker的NFS-Ganesha鏡像搭建nfs服務(wù)器,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
docker?compose部署mongodb?分片集群的操作方法
分片機(jī)制(Sharding)是MongoDB中用于處理大規(guī)模數(shù)據(jù)集和高負(fù)載應(yīng)用的一種數(shù)據(jù)分布策略,通過將數(shù)據(jù)均勻分布在多個(gè)服務(wù)器上,分片技術(shù)能夠提高應(yīng)用的可擴(kuò)展性和性能,本文給大家介紹docker?compose部署mongodb?分片集群的相關(guān)操作,感興趣的朋友一起看看吧2024-10-10
Docker部署B(yǎng)Iind9 DNS服務(wù)器過程
這篇文章主要介紹了Docker部署B(yǎng)Iind9 DNS服務(wù)器過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
docker部署Minio報(bào)錯(cuò):Fatal glibc error:CPU does&nb
在CentOS 7上使用Docker部署Minio時(shí)遇到CPU不支持問題,通過研究確定是版本太新,由于項(xiàng)目經(jīng)費(fèi)有限,決定降級(jí)到CentOS 7,步驟包括拉取Minio鏡像、創(chuàng)建目錄、開放端口和運(yùn)行2024-12-12

