解决docker容器设置DNS不生效的问题

 更新时间:2025年01月06日 09:13:32   作者:catoop  
文章主要介绍了如何在Docker中设置DNS,并通过两种方式(`docker run`和`docker-compose.yml`)进行了详细说明,虽然`docker run`方式可以成功设置DNS,但`docker-compose.yml`方式在某些情况下会导致DNS配置无效,因为容器的`/etc/resolv.conf`文件

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 的需求。

相关连接:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringCloud基于Docker和Docker-Compose的项目部署过程

    SpringCloud基于Docker和Docker-Compose的项目部署过程

    本文介绍了如何卸载旧版本Docker、更新系统、安装Docker及其依赖,并设置国内镜像源以加快下载速度,详细说明了如何安装Docker Compose、配置镜像加速器,并展示了如何使用Docker Compose部署SpringCloud项目,提供了更新和重启容器的方法
    2024-10-10
  • Docker Stack 部署web集群的方法步骤

    Docker Stack 部署web集群的方法步骤

    这篇文章主要介绍了Docker Stack 部署web集群的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • docker部署lnmp-wordpress的实现步骤

    docker部署lnmp-wordpress的实现步骤

    本文主要介绍了docker部署lnmp-wordpress的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Docker中的容器文件拷贝及目录挂载方式

    Docker中的容器文件拷贝及目录挂载方式

    这篇文章主要介绍了Docker中的容器文件拷贝及目录挂载方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker环境变量配置不生效/ect/profile的解决方法

    docker环境变量配置不生效/ect/profile的解决方法

    docker在使用过程中,有时候自定义容器实例中的某些配置文件,本文主要介绍了docker环境变量配置不生效/ect/profile的解决方法,感兴趣的可以了解一下
    2023-08-08
  • docker内部ping和ip命令的使用方式

    docker内部ping和ip命令的使用方式

    这篇文章主要介绍了docker内部ping和ip命令的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Docker 下载镜像慢的问题解决办法

    Docker 下载镜像慢的问题解决办法

    这篇文章主要介绍了Docker 下载镜像慢的问题解决办法的相关资料,需要的朋友可以参考下
    2017-04-04
  • docker快速部署zabbix的方法

    docker快速部署zabbix的方法

    zabbix标准组件是分布式的,因此部署过程中需要创建多个容器,本文主要介绍了docker快速部署zabbix的方法,具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 如何优化Docker镜像的大小详解

    如何优化Docker镜像的大小详解

    本文详细介绍了Docker的定义和优点,以及如何通过优化Docker镜像来提高其轻量化和便携性,通过使用轻量化基础镜像和多阶段构建,可以显著减小Docker镜像的大小,从而提高部署和运行效率
    2025-03-03
  • Docker安装Mosquitto的实现示例

    Docker安装Mosquitto的实现示例

    mosquitto是一个常用的MQTT应用服务,本文主要介绍了Docker安装Mosquitto的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05

最新评论