背景
用docke部署了一個服務,在本地一樣的環境測試沒問題,但是在正式服會報curl(56):connection reset by peer錯誤,網上搜了一堆答案,諸如端口映射、防火牆配置、代理類的答案都沒解決。
詳細可以參照https://www.shuzhiduo.com/A/ZOJPm4LE5v/,這里只是用於個人記錄
解決
- 1.首先確認容器起來后,exec進入容器里驗證服務是正常啟動了的,例如可以在容器里用curl驗證,另外還需確定端口是開放到0.0.0.0(而不是127.0.0.1)
- 2.確定服務是正常啟動了,一般就是因為端口映射的問題,導致在宿主機上訪問不了
- 3.嘗試修改端口映射、expose端口無果
- 4.直接--net=host,讓容器與宿主機共享網卡即網絡配置,不進行端口映射即可
附:docker的四種網絡模式https://www.cnblogs.com/gispathfinder/p/5871043.html
后續--建議的解決方案
因為需要開多個相同鏡像容器的需求,需要使用多個不同的端口,所以上述解決方法不滿足該需求,不可以避免得改了端口就會導致curl(56)錯誤,最終經過排查,發現根本原因是所使用的正式服服務器的iptables默認是drop掉所有包的
解決:
- 方法1:增加放通宿主機到docker的規則,iptables -I OUTPUT -o docker0 -j ACCEPT
- 方法2:增加放通宿主機到容器的具體IP,iptables -A OUTPUT -d 172.17.0.0/24 -j ACCEPT(建議使用該方法,因為容器啟動時的網卡模式是不一定的,虛擬網卡不一定對應是docker0)
- 注:具體的容器ip可以通過
docker inspect <container ID> | grep IP查看
