訪問Docker容器響應'ERR_CONNECTION_RESET'的問題排查


前言

接到反饋說剛才好好的單體Docker容器無法訪問了。瀏覽器訪問超時並顯示ERR_CONNECTION_RESET

問題排查

首先想到的就是服務掛了,但是從docker ps -a來看,容器運行良好,且都對外開放了相應的端口。

1. 排查端口

宿主機使用 lo 網卡訪問響應端口,看下端口連通性。

1
2
3
4
5
6
7
> wget -O- 127.0.0.1:8500
[root@localhost ~]# wget -O- 127.0.0.1:8500
--2020-06-10 22:25:43-- http://127.0.0.1:8500/
正在連接 127.0.0.1:8500... 已連接。
已發出 HTTP 請求,正在等待回應... 讀取文件頭錯誤(Connection reset by peer)。
重試中。
...

首先確認端口是通的,但是被拒絕了,下面抓包看一下。啟動抓包並重新發送 wget 請求

1
> tcpdump port 8500 -i lo -vvv -w /srv/out.cap

正常發送HTTP請求,收到了RST。所以瀏覽器才會顯示ERR_CONNECTION_RESET

經查,端口沒問題。

2. 排查容器

已經知道了宿主機訪問會出現問題,那就看下在容器內訪問能不能正常響應,進入一個和目標容器相同子網的容器。這里以busybox為例,子網使用的 bridge 模式,容器啟動時選擇相同的 Docker 網卡即可

1
2
3
4
> docker exec -it busybox sh
> wget -O- 192.168.24.151:8500
Connecting to 192.168.24.151:8500 (192.168.24.151:8500)
*** HTML 內容 ***

能正常響應頁面,在相同子網內訪問是沒有問題的。

3. 排查網卡

從前兩項排查可知,宿主機無法訪問,Docker子網內可以訪問。那就是網卡應該出現了問題。因為是所有容器都是跑在新建的網卡下面的,所以直接查看宿主機網卡信息

居然有兩個相同的網卡,居然是因為網卡沖突了。上一個出入流量很高,后一個就很低。查看現在正在使用的網卡ID,是用的上面這個流量高的網卡,而且后一個網卡也沒有看到對應的網絡信息。

1
2
3
4
5
6
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
edbd45482644 bridge bridge local
a0b6ef0cf177 host host local
715b7fddecd5 xxx-network bridge local
ef3d1b9a5ebc none null local

刪掉沒用的那個網卡就可以了

1
> ip link delete br-fae0e0150543

總結

網卡沖突帶來的連接重置,通過后期查詢解決網卡沖突得知,Linux內核默認是給ARP做了VIP的,所以兩個網卡都可以訪問,但是docker什么時候創建的網卡就不得而知了。🔚


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM