前言
接到反馈说刚才好好的单体Docker容器无法访问了。浏览器访问超时并显示ERR_CONNECTION_RESET
。
问题排查
首先想到的就是服务挂了,但是从docker ps -a
来看,容器运行良好,且都对外开放了相应的端口。
1. 排查端口
宿主机使用 lo
网卡访问响应端口,看下端口连通性。
1 |
> wget -O- 127.0.0.1:8500 |
首先确认端口是通的,但是被拒绝了,下面抓包看一下。启动抓包并重新发送 wget 请求
1 |
> tcpdump port 8500 -i lo -vvv -w /srv/out.cap |
正常发送HTTP请求,收到了RST。所以浏览器才会显示ERR_CONNECTION_RESET
经查,端口没问题。
2. 排查容器
已经知道了宿主机访问会出现问题,那就看下在容器内访问能不能正常响应,进入一个和目标容器相同子网的容器。这里以busybox为例,子网使用的 bridge
模式,容器启动时选择相同的 Docker 网卡即可
1 |
> docker exec -it busybox sh |
能正常响应页面,在相同子网内访问是没有问题的。
3. 排查网卡
从前两项排查可知,宿主机无法访问,Docker子网内可以访问。那就是网卡应该出现了问题。因为是所有容器都是跑在新建的网卡下面的,所以直接查看宿主机网卡信息
居然有两个相同的网卡,居然是因为网卡冲突了。上一个出入流量很高,后一个就很低。查看现在正在使用的网卡ID,是用的上面这个流量高的网卡,而且后一个网卡也没有看到对应的网络信息。
1 |
[root@localhost ~]# docker network ls |
删掉没用的那个网卡就可以了
1 |
> ip link delete br-fae0e0150543 |
总结
网卡冲突带来的连接重置,通过后期查询解决网卡冲突得知,Linux内核默认是给ARP做了VIP的,所以两个网卡都可以访问,但是docker什么时候创建的网卡就不得而知了。🔚