在 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 问题还是网络问题

这是最重要的一步。
如果容器中安装了 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。

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 网络结构以及其他业务需求。

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 更容易定位真正原因。







