Docker daemon及容器实例的DNS配置详解

Docker daemon DNS配置详解:从daemon.json到容器实例
本文详细解读了Docker daemon的DNS配置方法,包括通过daemon.json文件和dockerd命令参数,并介绍了容器实例的DNS解析顺序。重点讲解了如何在Docker容器中设置专用DNS和默认DNS的优先级。

Docker daemon及容器实例的DNS配置详解
2022-01-22 18:37 180阅读 0赞

Linux系统中,DNS解析器是一组C库的进程,用以访问DNS服务器。DNS解析器通过/etc/resolv.conf配置文件给出要访问的DNS服务器,配置文件修改后立刻生效,但系统重启后/etc/resolv.conf配置文件的内容回滚到初始状态。

Docker daemon的DNS配置

Docker daemon的配置有两种方式,一种是通过/etc/docker/daemon.json文件,另一种是通过dockerd的命令参数。

对于Docker daemon的DNS配置,二选一,不能同时以两种方式进行同一参数的配置,否则dockerd启动会失败。

  1. 配置/etc/docker/daemon.json文件的DNS属性
    {
    “dns”: [“8.8.8.8”, “8.8.4.4”, “2001:4860:4860::8888”, “2001:4860:4860::8844”],
    “dns-opts”: [“debug”],
    “dns-search”: [“example.com”],

    }
  2. dockerd命令的DNS参数

dockerd —dns 8.8.8.8 —dns-opt debug —dns-search example.com

docker run命令的DNS参数

在启动Docker容器实例的docker run命令中,也可以通过如下命令参数,为要创建的容器实例配置专用的DNS参数。

--dns
--dns-option或—dns-opt
--dns-search

docker run -d —dns 8.8.8.8 —dns-opt debug —dns-search example.com --name myContainer myImage:latest

Docker容器实例中解析DNS的顺序
  1. 首先,查找Docker daemon内置的DNS服务器127.0.0.11

  2. 其次,查找docker run创建容器实例时通过—dns参数设置的DNS服务器

  3. 再次,查找Docker daemon通过—dns参数,或/etc/docker/daemon.json文件设置的DNS服务器

  4. 又次,查找Docker宿主机上/etc/resolv.conf文件中配置的DNS服务器

  5. 最后,查找Google的DNS服务器,如8.8.8.8和8.8.4.4,2001:4860:4860::8888和2001:4860:4860::8844

参考链接:

https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/

https://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/

转自:https://www.dandelioncloud.cn/article/details/1484837542863372289,侵删

### 如何配置或修改 Docker 容器DNS 设置 #### 方法一:全局配置 DockerDNS 可以通过编辑 `/etc/docker/daemon.json` 文件来为所有的 Docker 容器设置默认的 DNS。此方法适用于通过 `docker run` 命令启动并连接到默认网络(即使用 `docker0` 网桥)的容器。 以下是具体操作步骤: 1. **创建或编辑 `/etc/docker/daemon.json` 文件** 使用以下命令打开文件进行编辑: ```bash sudo vim /etc/docker/daemon.json ``` 2. **添加 DNS 配置** 在文件中添加如下内容,其中 `"自建DNS服务的IP"` 是可选字段,可以根据实际需求替换为你自己的 DNS 服务器地址: ```json { "dns": ["8.8.8.8", "8.8.4.4"] } ``` 如果存在其他配置项,则需将其与现有 JSON 数据合并[^2]。 3. **重载配置并重启 Docker 服务** 执行以下命令以应用新的配置: ```bash sudo systemctl daemon-reload sudo systemctl restart docker ``` #### 方法二:单个容器运行时指定 DNS 如果只想针对某个特定容器设置 DNS 而不影响其他容器,可以在执行 `docker run` 命令时通过 `--dns` 参数手动指定 DNS 服务器地址。 例如: ```bash docker run --dns=8.8.8.8 --dns=8.8.4.4 -it ubuntu bash ``` 上述命令会在启动一个新的基于 Ubuntu 映像的交互式终端的同时为其分配 Google 提供的公共 DNS 服务器作为解析服务[^4]。 #### 方法三:验证 DNS 配置是否生效 为了确认新设定的 DNS 已被正确加载至目标容器内部,可以进入该容器并通过读取其 `/etc/resolv.conf` 文件的内容来进行检查: ```bash docker exec <container_id> cat /etc/resolv.conf ``` 或者直接利用临时容器测试: ```bash docker run -it --rm ubuntu cat /etc/resolv.conf ``` 正常情况下应该能看到之前所定义好的 nameserver 条目显示出来[^1]。 #### 注意事项 需要注意的是,DNS 解析机制不同于路由转发,即使宿主机已经设置了合适的外部DNS源也不能自动传递给里面的各个虚拟环境(比如这里的Docker Container),因此必须显式的告诉每一个需要联网工作的实例去哪里寻找权威性的名字解释机构[^3]。 ```python # 示例 Python 脚本用于展示如何动态获取当前机器上的所有可用 IP 地址列表 (非必要部分) import socket def get_ip_addresses(): hostname = socket.gethostname() ips = socket.gethostbyname_ex(hostname)[2] return ips print(get_ip_addresses()) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值