在 CentOS 上使用 Docker 容器无法联网,这是一个非常常见的问题,原因通常集中在 网络模式、防火墙、iptables、DNS、或宿主机网络配置。下面按最常见 → 较少见的顺序帮你排查。
CentOS 默认启用 firewalld,会拦截 Docker 的 NAT 流量。
检查:
systemctl status firewalld
临时解决(测试用):
systemctl stop firewalld
永久解决(推荐):
systemctl disable firewalld
⚠️ 生产环境可保留 firewalld,但需放行 docker 网桥
Docker 依赖 iptables 做 NAT。
检查:
docker info | grep iptables
如果看到:
WARNING: iptables disabled
解决:
编辑 /etc/docker/daemon.json
{
"iptables": true
}
然后:
systemctl restart docker
这是非常常见的“假断网”。
测试:
docker run --rm alpine ping 8.8.8.8
docker run --rm alpine ping www.baidu.com
如果 IP 通、域名不通 → DNS 问题
解决:
docker run --rm --dns=8.8.8.8 alpine ping www.baidu.com
或修改:
vim /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "114.114.114.114"]
}
systemctl restart docker
docker run --network none nginx
→ 完全无网络
docker run --network host nginx
→ 直接用宿主机网络(某些场景会失败)
✅ 默认应使用:
docker run nginx
(bridge 模式)
如果你自己建了网络:
docker network create mynet
但没指定网关,可能异常。
查看:
docker network inspect mynet
ping 8.8.8.8
如果宿主机都不通,容器一定不通。
Docker 需要 IP 转发:
cat /proc/sys/net/ipv4/ip_forward
如果是 0:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
getenforce
如果是 Enforcing:
setenforce 0
或:
vim /etc/selinux/config
SELINUX=disabled
# 1. 宿主机网络
ping 8.8.8.8
# 2. Docker 服务
systemctl status docker
# 3. 容器测试
docker run --rm alpine ping 8.8.8.8
docker run --rm alpine ping www.baidu.com
# 4. 防火墙
systemctl status firewalld
# 5. iptables
iptables -L -n
你可以直接贴出:
cat /etc/os-releasedocker versiondocker run --rm alpine ping 8.8.8.8 的输出iptables -L -n 输出我可以 精准定位是哪一步出问题,而不是泛泛而谈。