设定DNS的方法
先来说一下 docker run 和 docker-compose 指定 dns 的方法。
1、docker run 命令 设置 dns
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
。
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 的需求。
相关连接
(END)