前言
接到反饋說剛才好好的單體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什么時候創建的網卡就不得而知了。🔚