设定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​ ​。

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)


2.【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 ) 3.所谓的javascript高级技巧 4.Android开发之旅: Intents和Intent Filters(实例部分) 5.find命令高级用法举例