我使用docker部署了几个web服务,这些web服务会暴露出一些端口出来提供服务。
现象
如果我使用下面的命令重启了计算机网络
nmcli networking off && nmcli networking on
则docker提供的那些web服务就不可用了
# 在宿主机中执行以下命令,8096是docker容器中web服务暴露出的端口
curl localhost:8096
> curl (56) Recv failure: Connection reset by peer
但是,如果进入到容器内部发现服务确实是可用的
docker exec -it CONTAINER bash
# 下面命令是在容器内执行的
curl localhost:8096
> <html>...</html>
通过 docker ps
命令查看容器确实正常运行的,也确实有把端口暴露出来
排查
从上面的现象可以看出,服务运行是没问题的,那么问题肯定出在容器到宿主机直接的网络转换过程了,docker中容器同宿主机通信是建立在docker建立的虚拟网卡之上的
使用 netstat -rn
或者 ip r
查看宿主机路由表时会发现没有docker创建的虚拟网卡,正常情况下docker会在启动时创建名为docker0的虚拟网卡,并且也会为每个桥接网络的容器创建一个单独的虚拟网卡:

这就说明应该是重启网络时,这些虚拟网卡都被清除了
解决
简单方式就是重启网络后再重启docker,它就会重新创建虚拟网卡
systemctl restart docker
如果容器创建时没有指定 restart: unless-stopped
参数,则还需要手动将容器启动