主机访问docker映射的端口报错curl(56)解决
背景
用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
查看
如果加班只是玩手机、刷微博,那一定是煎熬。如果是坚持的修炼,那一定收益颇丰。