欢迎光临
我们一直在努力

Docker 容器无法访问外网怎么办?DNS 与网络排查教程

在 Linux 服务器上运行 Docker 时,有时会遇到这样一种情况:

服务器本身可以正常访问互联网,但 Docker 容器内部无法访问外部网站。

常见表现包括:

容器无法访问域名;

curl 一直超时;

DNS 解析失败;

容器无法下载软件包;

应用连接外部 API 失败;

宿主机正常,但所有 Docker 容器都无法联网。

这类问题不能只看“Docker 能不能启动”。

建议先区分到底是:

DNS 解析异常

还是:

容器本身无法访问外部网络

然后再继续排查 Docker Network、网关、IP 转发、防火墙和 NAT。

1. 先确认宿主机能否正常联网

排查 Docker 之前,先确认 Linux 服务器本身能够访问外网。

例如:

curl -I https://www.baidu.com

也可以测试一个公网 IP:

ping -c 3 1.1.1.1

如果服务器宿主机本身就无法访问外网,那么问题通常不在 Docker。

应该先检查服务器:

网络配置;

默认路由;

DNS;

安全策略;

上游网络。

如果宿主机访问正常,而只有 Docker 容器异常,再继续下面的步骤。

2. 确认具体哪个容器无法联网

首先查看容器:

docker ps

假设需要排查的容器名称为:

web

可以进入容器:

docker exec -it web sh

部分镜像支持:

docker exec -it web bash

需要注意,一些精简镜像可能没有安装 ping、curl、bash 等工具。

因此实际使用什么命令,需要根据容器镜像决定。

如果只有一个容器无法联网,而其他 Docker 容器正常,更应该优先检查这个容器所属的 Network 和应用配置。

如果所有容器同时无法访问外网,则应该重点检查 Docker 网络、转发和防火墙。

3. 先判断是 DNS 问题还是网络问题

Docker容器判断网络故障还是DNS异常

这是最重要的一步。

如果容器中安装了 ping,可以先测试公网 IP:

ping -c 2 1.1.1.1

或者使用 curl 测试一个能够直接访问的目标。

然后测试域名解析:

getent hosts example.com

如果出现:

公网 IP 可以访问,但是域名无法解析

通常说明容器基本网络正常,问题更可能来自 DNS。

如果:

公网 IP 和域名都无法访问

则说明问题可能来自:

Docker Network;

默认路由;

IP Forward;

iptables / nftables;

NAT;

宿主机防火墙。

这两类故障应该分开处理。

4. 查看容器 DNS 配置

进入容器后可以查看:

cat /etc/resolv.conf

不同 Docker 网络模式下,实际内容可能不同。

在 Docker 用户自定义网络中,经常可以看到 Docker 提供的内部 DNS 地址。

而某些网络模式下,也可能看到从宿主机继承或生成的 DNS 配置。

如果应用日志中出现:

Temporary failure in name resolution

Could not resolve host

Name or service not known

等提示,就应该重点检查 DNS。

5. 测试 DNS 是否能够正常解析

可以执行:

getent hosts example.com

如果容器安装了 nslookup:

nslookup example.com

如果安装了 dig:

dig example.com

如果域名解析失败,而公网 IP 可以正常访问,可以尝试检查宿主机 DNS:

cat /etc/resolv.conf

确认宿主机当前使用的 DNS 是否正常。

如果服务器刚刚修改过 DNS、网络配置或 systemd-resolved,也要确认 Docker 当前容器是否仍然使用了旧配置。

6. Docker Compose 如何指定 DNS?

如果确实需要为某个 Compose 项目指定 DNS,可以在服务中配置:

services:
  app:
    image: example/app:latest
    dns:
      - 1.1.1.1
      - 8.8.8.8

保存以后重新部署:

docker compose up -d

如果需要确保容器重新创建:

docker compose up -d --force-recreate

然后再次进入容器检查:

cat /etc/resolv.conf

并测试:

getent hosts example.com

需要注意,公共 DNS 不一定适用于所有网络环境。

如果服务器所在网络使用运营商 DNS、企业 DNS 或内部 DNS,应根据实际情况配置,不要机械地使用公共 DNS。

7. 查看 Docker Network

执行:

docker network ls

通常可以看到:

bridge

host

none

以及 Docker Compose 自动创建的自定义网络。

查看默认 bridge:

docker network inspect bridge

如果是 Compose 项目,可以先执行:

docker compose ps

再查看容器加入了哪些网络:

docker inspect -f '{{json .NetworkSettings.Networks}}' 容器名称

重点确认:

容器是否已经加入预期 Network;

是否分配了 IP;

Network 是否存在正确的 Subnet;

是否存在 Gateway。

Docker检查容器网络和默认网关

8. 检查容器默认网关

进入容器后执行:

ip route

正常情况下应该存在默认路由。

例如:

default via 172.17.0.1 dev eth0

如果没有类似:

default via

的路由,容器通常无法正常访问其他网络。

也可以通过:

docker network inspect bridge

查看 Docker 网络配置中的:

Subnet

以及:

Gateway

如果网络信息明显异常,可以进一步检查这个 Network 是否被人为修改。

9. 检查容器能否访问 Docker 网关

假设容器默认网关是:

172.17.0.1

可以在容器内测试:

ping -c 2 172.17.0.1

如果连 Docker 网关都无法访问,则问题通常更靠近:

Docker Network;

容器网卡;

Bridge;

宿主机转发。

如果 Docker 网关正常,但无法继续访问公网,就应该重点检查宿主机的转发和 NAT。

10. 检查 Linux IP Forward

Docker bridge 网络通常需要宿主机进行网络转发。

查看:

sysctl net.ipv4.ip_forward

正常情况下通常应该看到:

net.ipv4.ip_forward = 1

也可以直接查看:

cat /proc/sys/net/ipv4/ip_forward

如果输出:

0

说明 IPv4 转发当前被关闭。

可以临时启用:

sysctl -w net.ipv4.ip_forward=1

但如果重启服务器后又恢复为关闭状态,还需要继续检查系统持久化的 sysctl 配置。

在修改服务器网络参数之前,建议先确认当前 Docker 网络结构以及其他业务需求。

Docker检查Linux IP转发和NAT规则

11. 检查 Docker NAT 规则

Docker bridge 网络访问公网时,通常还涉及宿主机 NAT。

如果系统使用 iptables,可以查看:

iptables -t nat -S

重点关注 Docker 网络相关规则以及:

MASQUERADE

例如:

iptables -t nat -S | grep MASQUERADE

如果 Docker 创建的 NAT 规则被防火墙脚本清空,可能出现:

宿主机可以正常访问外网;

Docker 容器无法访问外网。

如果系统主要使用 nftables,可以查看:

nft list ruleset

不要在没有确认现有规则用途的情况下直接清空 iptables 或 nftables。

服务器上可能同时运行:

网站;

Docker;

安全防护;

端口转发;

其他业务。

直接清空规则可能导致更严重的网络中断。

12. 检查 FORWARD 转发规则

还可以查看:

iptables -L FORWARD -n -v

如果 FORWARD 链存在阻止 Docker 流量的规则,也可能导致容器无法访问外网。

特别是服务器安装过:

防火墙管理工具;

安全软件;

自定义 iptables 脚本;

网络防护软件;

之后,需要重点确认这些工具是否修改了 Docker 所需的转发规则。

如果问题是在修改防火墙以后突然出现,排查方向就更加明确。

13. firewalld 或 UFW 会影响 Docker 吗?

有可能。

如果使用 UFW,可以查看:

ufw status verbose

如果使用 firewalld:

firewall-cmd --list-all

以及:

firewall-cmd --get-active-zones

Docker 会创建自己的网络和防火墙规则。

如果另外的防火墙工具重新加载规则,或者自定义配置阻止转发,就可能导致 Docker 网络异常。

因此:

“服务器 80/443 正常”

并不能说明:

“Docker 容器访问公网的 FORWARD 和 NAT 也一定正常”。

两者属于不同的排查方向。

14. Docker 重启后突然不能联网怎么办?

如果问题是在执行:

systemctl restart docker

或者服务器重启以后出现,可以先检查:

systemctl status docker --no-pager

再查看 Network:

docker network ls

检查容器:

docker ps -a

如果容器已经恢复,但网络异常,可以继续检查:

docker network inspect bridge
sysctl net.ipv4.ip_forward

以及 NAT / FORWARD 规则。

不要一开始就删除:

/var/lib/docker

或者整个 Docker 网络数据目录。

这类操作可能影响现有容器、Volume 和业务数据。

15. 自定义 Docker Network 是否有问题?

Docker Compose 通常会自动创建项目网络。

例如:

docker network ls

可能看到:

myproject_default

可以执行:

docker network inspect myproject_default

确认:

Subnet;

Gateway;

Containers;

IP 地址。

如果自定义网络使用的网段和服务器实际网络发生冲突,也可能造成异常。

例如 Docker 网络使用:

172.18.0.0/16

而服务器内部网络、VPN 或其他路由也使用了相同范围,就可能导致路由冲突。

这种情况下,应根据实际网络规划调整 Docker 子网,而不是简单反复重启容器。

16. 如何重新创建 Compose Network?

如果已经确认自定义 Network 配置异常,而且业务允许重新创建,可以先做好必要的数据备份。

进入 Compose 项目目录后:

docker compose down

然后:

docker compose up -d

Compose 会根据配置重新创建相关网络。

需要注意:

docker compose down

可能停止当前项目服务。

正式业务操作前需要确认维护时间以及数据持久化情况。

如果 Compose 文件中声明了外部 Network,则不能简单按照上述方式判断,需要根据实际 Network 配置处理。

17. 单个容器无法联网,但其他容器正常

如果只有一个容器无法访问外网,通常不需要先修改整个 Docker 服务。

可以先查看这个容器:

docker inspect 容器名称

重点检查:

NetworkMode;

Networks;

DNS;

Gateway;

IP 地址。

可以执行:

docker inspect -f '{{.HostConfig.NetworkMode}}' 容器名称

再查看:

docker inspect -f '{{json .NetworkSettings.Networks}}' 容器名称

如果该容器配置了特殊的:

network_mode

dns

extra_hosts

代理环境变量;

就应该优先检查这些单独配置。

18. 容器不能访问域名,但可以访问 IP

如果已经确认:

公网 IP 可以访问

但是:

域名无法解析

这时不要继续折腾 iptables NAT。

优先检查:

/etc/resolv.conf

DNS 地址;

Compose dns 配置;

宿主机 DNS;

应用是否设置了自己的 DNS;

内部网络是否限制公共 DNS。

可以执行:

getent hosts example.com

确认解析结果。

这种故障本质上属于 DNS 层面,而不是完整的网络中断。

19. 容器 IP 和域名都无法访问

如果:

公网 IP 无法访问;

域名也无法解析;

Docker 网关也异常;

就应该重点检查:

Docker Network;

默认路由;

IP Forward;

FORWARD;

NAT;

宿主机防火墙。

建议按照网络链路从内到外逐层排查,不要随机修改配置。

20. 使用 host 网络能解决吗?

Linux Docker 支持:

network_mode: host

这种模式会让容器直接使用宿主机网络。

但不建议为了“修复容器无法联网”就直接把所有项目改成 host 网络。

因为 host 网络会改变:

端口映射;

网络隔离;

服务暴露方式;

容器间通信方式。

正确做法应该是先找到 bridge 网络为什么异常。

只有项目本身明确适合 host 网络时,再根据实际需要使用。

21. Docker 网络故障快速排查顺序

遇到 Docker 容器无法访问外网时,可以按照以下顺序:

第一步:确认宿主机网络

curl -I https://www.baidu.com

第二步:测试容器访问公网 IP

ping -c 2 1.1.1.1

第三步:测试 DNS

getent hosts example.com

第四步:查看容器 DNS

cat /etc/resolv.conf

第五步:查看 Docker Network

docker network ls
docker network inspect bridge

第六步:查看容器路由

ip route

第七步:检查 IP Forward

sysctl net.ipv4.ip_forward

第八步:检查 NAT

iptables -t nat -S | grep MASQUERADE

第九步:检查 FORWARD

iptables -L FORWARD -n -v

通过这个顺序,可以比较快地区分问题来自:

DNS;

Docker Network;

默认路由;

系统转发;

防火墙;

NAT。

22. 不建议直接执行哪些操作?

遇到 Docker 网络问题时,不建议在没有确认原因前直接:

删除全部 Docker Network;

清空所有 iptables;

删除 /var/lib/docker;

重新安装 Docker;

关闭所有服务器防火墙;

把所有容器切换到 host 网络。

这些方式虽然可能暂时改变现象,但同时可能破坏正常运行的其他 Docker 项目。

服务器上存在正式业务时,应该先记录现有配置,再进行针对性修改。

23. 服务器本身网络质量也需要考虑

如果容器并非完全无法联网,而是:

访问非常慢;

频繁超时;

偶尔成功;

连接国外 API 不稳定;

也需要考虑服务器本身的网络质量、目标服务线路以及外部网络情况。

可以先在宿主机直接测试相同目标。

如果宿主机访问同一个 API 也存在明显问题,那么就不一定是 Docker 网络故障。

如果需要部署 Docker 网站、API、监控系统或者其他自托管项目,可以根据业务所在地区和访问需求选择莱卡云 Linux 云服务器。

查看官网购买链接: https://www.lcayun.com

如果还没有安装 Docker,可以参考:

安装教程: 服务器上安装docker和docker-compose教程

如果问题属于“端口已经开放但外部无法访问”,可以继续参考:

相关阅读: 云服务器端口不通怎么办?Connection refused 与 timed out 排查教程

24. 总结

Docker 容器无法访问外网时,首先不要直接重装 Docker。

最重要的是先判断:

到底是 DNS 解析失败,还是整个容器网络都无法访问公网。

如果公网 IP 可以访问,但域名无法解析,优先检查 DNS。

如果公网 IP 和域名都无法访问,则继续检查:

Docker Network;

默认网关;

IP Forward;

FORWARD;

NAT;

防火墙。

可以先通过:

docker network inspect bridge

确认 Docker 网关。

再通过:

sysctl net.ipv4.ip_forward

检查 Linux 网络转发。

最后结合:

iptables -t nat -S

以及:

iptables -L FORWARD -n -v

确认 Docker 转发和 NAT 规则。

按照“宿主机 → 容器 IP → DNS → Docker Network → 路由 → 转发 → NAT → 防火墙”的顺序排查,通常比反复重启 Docker 更容易定位真正原因。

赞(0)
未经允许不得转载:莱卡云 » Docker 容器无法访问外网怎么办?DNS 与网络排查教程