Docker容器内无法解析DNS

2026-06-15 25
Docker

类型:虚拟化技术

简介:基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。

在使用 Docker 容器时,经常会遇到一种典型问题:容器内部无法解析内网域名,但宿主机却可以正常访问。这类问题在微服务架构和内网服务调用中非常常见。

一、故障现象

常见表现如下:

  • 宿主机可以 ping 通 redis-master,但容器内无法解析该域名
  • 宿主机可以正常访问 nginx(curl 正常),容器内访问失败
  • 容器可以解析公网域名(如 baidu.com),但无法解析内网域名(如 redis-master.internal)
  • 跨容器通信时报错:could not resolve host

二、故障原因分析

Docker 默认使用内置 DNS 服务(127.0.0.11),该服务仅用于解析 Docker 网络内部服务名称。

其特点如下:

  • 仅支持 Docker network 内部服务发现
  • 依赖 –link 或自定义 Docker network 的容器名称解析
  • 无法识别宿主机或企业内网 DNS 记录

因此,当访问类似 redis-master.internal 这类企业内网域名时,就会出现解析失败问题。

三、解决方案

方案1:容器启动时指定 DNS

docker run --dns 192.168.1.53 nginx

通过指定企业内网 DNS 服务器解决解析问题。

方案2:Docker Compose 配置 DNS

services:
  app:
    image: my-app:latest
    dns:
      - 192.168.1.53
      - 8.8.8.8
    networks:
      - my-net

说明:

  • 第一 DNS:企业内网 DNS
  • 第二 DNS:公网 DNS 备用

方案3:Docker 全局 DNS 配置

修改 daemon.json:

{
  "dns": ["192.168.1.53", "8.8.8.8"]
}

修改后需要重启 Docker:

systemctl restart docker

四、排查与验证命令

1. 查看容器 DNS 配置

docker exec <container-id> cat /etc/resolv.conf

2. 检查容器网络信息

docker inspect <container-id> | grep -A 10 "NetworkSettings"

3. 测试 DNS 解析

docker exec <container-id> nslookup nginx
docker exec <container-id> dig nginx

4. 检查宿主机 DNS 配置

cat /etc/resolv.conf

五、总结

Docker DNS 解析问题的核心原因在于:

  • Docker 内置 DNS 仅负责容器内部服务发现
  • 无法直接使用宿主机或企业内网 DNS

解决思路主要有三种:

  • 单容器级 DNS 指定(docker run –dns)
  • Compose 级 DNS 配置
  • 全局 Docker daemon DNS 配置

在企业内网环境中,推荐优先使用 Compose 或全局 DNS 配置,以保证所有容器一致性解析能力。

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。