类似的情况,在两台服务器上都遇到了,但解决方法不太相同。分别记录一下
情景1
问题描述
docker-compose up 启动了一组服务,其中包括了一个PG数据库服务。在启动过程中,报数据库无法连接的错误。
容器启动后,发现不单是数据库无法通信,而是容器间无法通信,启动失败。
解决
docker networks 、docker inspect 查看了相关的网络信息,也查看了防火墙状态,都没有发现问题。
随后重启了服务、重启了docker,都没有解决。
最后万能的服务器重启……发现解决了。
这个描述单独看没有太大的参考价值,但由于和情景2现象较为相似,且在同一时间发生,因此统一记录一下。
情景2
问题描述
同样的一组服务,docker-compose up启动之后,容器间可以通信,但对外提供的web服务(3000端口),发现无法访问。
尝试用 telnet 来测试,发现在宿主机上使用 telnet 127.0.0.1 3000可以联通,而尝试使用宿主机ip(即telnet host_ip 3000)则失败。
解决尝试1
也尝试了情景1中的各种重启组件、查看网络相关信息的操作,发现没有解决。
随后在https://cloud.tencent.com/developer/article/1803122看到了类似的情况,于是尝试修改docker0的网段,尝试后发现失败。
service docker stop
# 关闭docker0的网卡
ip link set dev docker0 down
# 删除docker0网桥
brctl delbr docker0
# 重建docker0网桥
brctl addbr docker0
# 设置IP段
ip addr add 172.17.42.2/24 dev docker0
# 启动docker0网桥
ip link set dev docker0 up
# 重启docker引擎
service docker start
解决办法
上面提到了查看网络信息,忘记怎么想起来执行了一下 ifconfig,发现居然存在2个所起docker-compose服务的网关信息,大概如下所示:
[wang@DESKTOP-K8UBC7R system32]$ ifconfig
br-xdklfjdkfjdk: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.0.1 netmask 255.255.255.0 broadcast 172.25.0.255
inet6 fe80::cb3b:32ed:42d1:4efb prefixlen 64 scopeid 0xfd<compat,link,site,host>
ether 48:2a:e3:7f:4b:39 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-lkajfdlkj: flags=73<UP,LOOPBACK,RUNNING> mtu 1500
inet 172.25.0.1 netmask 255.255.255.0 broadcast 172.25.0.255
inet6 ::1 prefixlen 128 scopeid 0xfe<compat,link,site,host>
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此处就猜测应该是重启服务的过程中,可能出现了一些差错,导致多了一个服务的网关(虚拟网卡),因此通信出现了问题。
尝试去服务正常的服务器上查看,发现只有一个虚拟网卡。
于是尝试docker-compose down掉服务,删掉网卡,重启服务。执行后,服务正常,问题解决。
删掉虚拟网卡的过程如下:
ip link delete br-xxxxx