【arm 环境】【docker】【centos】 容器不能访问外网,宿主机可以访问外网

本文描述了在CentOS系统中,Docker容器无法访问外网的问题及解决过程。问题出现时,即使宿主机网络正常,容器内的应用也无法联网。经过排查,发现并非防火墙导致的问题,而是Docker网络配置问题。解决方案是重启Docker服务,之后通过`iptables -t nat -L -n`命令查看,发现Docker网络已经可以正常转发数据包,从而解决了容器无法上网的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【arm 环境】【docker】【centos】 容器不能访问外网,宿主机可以访问外网

问题描述:
docker 构建镜像时候对镜像内需要进行资源配置时,发现不能访问外网
注意: 大家在使用docker的时候最好把宿主机的防火墙关了service iptables stop,因为创建容器的时候默认会在防火墙里面添加了docker规则。
cnetos systemctl stop firewalld

firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
   Active: inactive (dead) since Fri 2021-04-02 09:58:31 CST; 9min ago
     Docs: man:firewalld(1)
  Process: 20577 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS>
 Main PID: 20577 (code=exited, status=0/SUCCESS)

问题排查:

  1. docker 是通过与宿主机绑定方式进行网络通信,此时通过宿主机ip a 检查docker 网卡是否有有效ip
  2. 防火墙状态关闭
  3. 检查docker ip 有效性
[root@localhost panastor_arm_success]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination  

发现此时docker 此时网络的数据包是不能访问外部网络的
解决办法: 重启docker服务:service docker restart
iptables -t nat -L -n

[root@localhost ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0 

此时docker 这个ip 段可以上网

个人觉得docker是通过桥接绑定宿主机ip方式进行的网络通信,dns 配置问题可能性不大。所以并没从dns方面去考虑。

要使 Docker 容器能够访问容器外的网络,有几种方法可以实现: 1. 使用桥接网络模式:默认情况下,Docker 容器使用的是桥接网络模式(bridge)。在这种模式下,Docker 在主机上创建一个虚拟网桥(docker0),并将容器连接到该网桥上。通过桥接网络容器可以与宿主机和其他容器进行通信,并通过宿主机网络接口访问外部网络。 2. 使用主机网络模式:通过使用主机网络模式(host),可以使容器直接使用宿主机网络栈,与宿主机共享网络命名空间。这样容器就可以直接访问宿主机上的网络接口,并与外部网络进行通信。使用主机网络模式可以提高容器网络性能,但也会牺牲容器之间的隔离性。 3. 使用端口映射:通过使用端口映射,可以将容器内部的端口映射到宿主机上的一个端口。这样,外部网络就可以通过宿主机上的端口访问容器内部的服务。可以使用 `-p` 参数来指定端口映射规则,例如 `docker run -p 8080:80` 将容器内部的 80 端口映射到宿主机的 8080 端口。 4. 使用自定义网络Docker 允许创建自定义网络,并将容器连接到该网络上。在自定义网络中,容器可以通过网络别名或容器名称进行通信。通过自定义网络,可以将容器组织成逻辑网络,使其能够相互访问并与外部网络进行通信。 这些方法可以根据实际需求选择使用。根据容器的具体场景和要求,选择合适的网络模式和配置来实现容器与外部网络的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值