在 CentOS 上使用 Docker 容器连不上网,这是一个非常常见的问题,原因通常集中在 网络模式、防火墙、DNS、内核参数 这几个方面。下面我按最常见 → 较少见给你系统梳理一下,并给出对应解决办法。
CentOS 默认启用 firewalld,容易把 Docker 的 NAT 规则干掉。
检查
systemctl status firewalld
解决办法(任选一种)
✅ 方案 A(推荐):让 Docker 和 firewalld 共存
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
✅ 方案 B(测试环境可用):关闭 firewalld
systemctl stop firewalld
systemctl disable firewalld
ip addr show docker0
如果没有 docker0 或没有 IP:
systemctl restart docker
容器内:
ping 8.8.8.8 # 通
ping www.baidu.com # 不通
解决
修改 /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "114.114.114.114"]
}
然后:
systemctl restart docker
--network=none 或 hostdocker run --network=none nginx
none → 完全无网host → 直接用宿主机网络(可能受 CentOS 安全限制)✅ 正常应:
docker run -it centos ping www.baidu.com
如果你用了:
docker network create mynet
但没开网关 / 子网冲突,也会没网。
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
临时测试:
setenforce 0
永久(不推荐生产随便关):
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 1. 宿主机能不能上网
ping www.baidu.com
# 2. docker0 在不在
ip addr | grep docker0
# 3. 容器能不能 ping IP
docker run --rm centos ping 8.8.8.8
# 4. DNS 是否可用
docker run --rm centos ping www.baidu.com
# 5. 防火墙
systemctl status firewalld
你可以直接贴:
cat /etc/redhat-release)docker run 后 ping 的结果我可以直接告诉你 是哪一条导致的,并给你最小改动方案。