这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前情提要:在上一篇使用Docker部署GitLab中提到了发现了使用Docker创建容器,遇到了容器内无法访问外部网络的问题。
如果你已经尝试了很多方法,都无法奏效,直接看下面是不是相同的情况。
原因:eth0网卡的ipv4转发没有打开
注:每台机器的环境可能都不一样,不一定是eth0,可以查看/proc/sys/net/ipv4/conf
下的文件的forwarding
[root@test ~] cat /proc/sys/net/ipv4/conf/eth0/forwarding
0
[root@test ~] cat /proc/sys/net/ipv4/ip_forward
1
参考:
How to properly permanent enable ip forwarding in Linux with systemd?
接下来要修改这个网卡让它的转发为1
[root@test ~] cd /etc/systemd/network/
[root@test network] ls
10-eth0.network
[root@test network] vim 10-eth0.network
在查看这个文件时,发现[Network]
下只有一个DNS的配置。
查看[Network]
的相关信息:
Parameter | Description | Accepted Values | Default Value |
---|---|---|---|
IPForward= | If enabled, incoming packets on any network interface will be forwarded to any other interfaces according to the routing table. See Internet sharing#Enable packet forwarding for details. | boolean, ipv4 , ipv6 |
false |
可以看到IPForward的默认配置是false,就是说传入的包不会根据路由表转发到其它接口。
在[Network]
下增加IPForward=ipv4
[Network]
IPForward=ipv4 ##增加该行
重新启动网络
[root@test network] systemctl restart systemd-networkd
[root@test network] cat /proc/sys/net/ipv4/conf/eth0/forwarding
1
可以看到eth0的转发已开启。
开启一个容器进行测试
root@6bb3335c6d85:/usr/local/tomcat# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=7.85 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=7.80 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=111 time=7.79 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
容器内的网络已恢复正常。
如果你不是这种情况,可以参考方法总结
方法总结
参考:
网桥有问题
重建docker0
网桥
sudo service docker stop
sudo pkill docker
sudo iptables -t nat -F
sudo ifconfig docker0 down
sudo brctl delbr docker0
sudo service docker start
DNS有问题
能ping通ip地址但不能ping通域名
编辑/etc/docker/daemon.json
文件,添加dns信息
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
转发没有设置
查看转发是否为0
cat /proc/sys/net/ipv4/ip_forward
为0则进行以下设置
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #添加改行
sysctl –p
网段冲突
eth0与docker的虚拟网卡的网段有冲突
内核有问题
docker 加载内核的bridge.ko 驱动异常,导致docker0 网卡无法转发数据包
升级内核
sudo yum list kerner # 列出可用的内核
sudo yum update kernel -y # 升级内核
sudo reboot # 重启
进行以上操作后,最好重启一下Docker,如果Docker无法启动,如:Failed to start Docker Application Container Engine.
可以删除/etc/docker/daemon.json
文件,再稍等一会,重启Docker。
systemctl restart docker
总结
本文列举使用Docker创建容器后,容器内无法访问外部网络的各种解决方法。
今天的文章Docker容器内访问外部网络失败分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23305.html