重启网卡后docker容器的web服务不可用

我使用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 参数,则还需要手动将容器启动

Leave a Comment