解决docker容器设置DNS不生效的问题
docker容器设置DNS不生效问题
设定DNS的方法
先来说一下 docker run 和 docker-compose 指定 dns 的方法。
1、docker run 命令 设置 dns
docker run --dns=8.8.8.8
2、docker-compose.yml 文件中 设置dns
version: '3.9'
services:
coredns:
image: hello:1.0.0
container_name: hello
dns: 8.8.8.8通过以上两种方式配置 dns 后,你会发现 docker run方式设定的有效,docker-compose 方式设定的 dns 无效。
主要表现在容器中 /etc/resolv.conf 中的地址没有变化,修改文件重启后仍不生效。
不生效原因分析
容器的 /etc/hosts 、hostname 等文件 都是默认挂载宿主机里的配置的,命令行进入容器后,在容器中使用 mount 命令可以看到。
一般容器中默认的 nameserver 就是 127.0.0.11 。
解决方案
1、直接使用 volume 设置重新映射 /etc/resolv.conf 文件到宿主机的位置。既在宿主机上自定义一个文件(或者直接使用宿主机的 /etc/resolv.conf),挂载到容器内的 /etc/resolv.conf。
2、在 /etc/docker/daemon.json 中配置所有 docker 容器的缺省 dns(这里配置的 dns 仅对 docker run 默认网络启动的走 docker0 网桥的容器有效)。
3、在 docker-compose 中配置参数 network_mode: bridge 的容器。注意设置了该参数的容器不能再用 networks 配置额外的网络信息。
官方说明释义
参考官方文档说明,意思是如果使用默认的 docker0 网络的容器,dns 配置会生效,但是使用自定义网络话(docker-compose 默认就创建新的自定义网络),就不会用宿主机的 dns文件,从而不能覆盖 resolv.conf 配置,既不能生效。
而使用 docker run 默认使用的是桥接模式下的 docker0 网桥,所以生效。docker-compose 文件启动会创建新的网桥,所以不生效。
结合上述说明,如果想让 docker-compose.yml 中的容器配置 dns 生效,就需要为容器设置 network_mode: bridge 后再设置 dns,这样对应的容器 dns 生效(设定 network_mode: bridge 的容器可以通过相关命令查看它走的是 docker0 网桥)。
最后,因为 docker-compose 中 network_mode: bridge 和 networks,两个配置只能二选一,加上在 docker-compose 中为容器设定固定IP 又需要通过 networks 来配置,所以在 docker-compose 中如果你选择 network_mode: bridge 就之能放弃为容器设置固定 IP 的需求。
相关连接:
- https://github.com/docker/compose/issues/2847
- https://docs.docker.com/config/containers/container-networking/
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
docker和docker-compose的版本对应关系的实现
本文主要介绍了docker和docker-compose的版本对应关系的实现,两者虽非强制绑定,但新版本docker-compose可能依赖更高版本Docker引擎的API,具有一定的参考价值,感兴趣的可以了解一下2025-06-06
使用Docker的NFS-Ganesha镜像搭建nfs服务器的详细过程
这篇文章主要介绍了使用Docker的NFS-Ganesha镜像搭建nfs服务器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08
docker compose部署mongodb 分片集群的操作方法
分片机制(Sharding)是MongoDB中用于处理大规模数据集和高负载应用的一种数据分布策略,通过将数据均匀分布在多个服务器上,分片技术能够提高应用的可扩展性和性能,本文给大家介绍docker compose部署mongodb 分片集群的相关操作,感兴趣的朋友一起看看吧2024-10-10
docker部署Minio报错:Fatal glibc error:CPU does&nb
在CentOS 7上使用Docker部署Minio时遇到CPU不支持问题,通过研究确定是版本太新,由于项目经费有限,决定降级到CentOS 7,步骤包括拉取Minio镜像、创建目录、开放端口和运行2024-12-12


最新评论