Docker容器内访问外部网络失败

Docker容器内访问外部网络失败前情提要:在上一篇使用Docker部署GitLab中提到了发现了使用Docker创建容器,遇到了容器内无法访问外部网络的问题。本文列举了各种解决方案。

这是我参与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?

systemd-networkd

接下来要修改这个网卡让它的转发为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

容器内的网络已恢复正常。

如果你不是这种情况,可以参考方法总结

方法总结

参考:

centos7下ip转发的配置

docker无法连接外网问题

配置 DNS

centos7中docker网络docker0(bridge)与容器间网络不通的坑

网桥有问题

重建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

网段冲突

eth0docker的虚拟网卡的网段有冲突

参考使用Docker部署GitLab

内核有问题

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注