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/hostshostname 等文件 都是默认挂载宿主机里的配置的,命令行进入容器后,在容器中使用 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: bridgenetworks,两个配置只能二选一,加上在 docker-compose 中为容器设定固定IP 又需要通过 networks 来配置,所以在 docker-compose 中如果你选择 network_mode: bridge 就之能放弃为容器设置固定 IP 的需求。

相关连接


(END)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catoop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值