docker宿主无法访问容器端口
在VM中创建了一个centos7.2虚拟机并跑起docker搞个lnmp镜像玩一玩,一开始用的-p将宿主机端口映射一下(由于本来宿主机就跑着apache占用了80端口)
命令如下:
docker run -dit -p 90:80 -v /home/web/docker/www:/www --privileged=true --name=lnmp 2233466866/lnmp
跑倒是跑起来了,但奇怪的是打开浏览器访问虚拟机的IP+映射的端口(这里是90),却无法访问到nginx
于是就各种排查,netstat看过,防火墙通通都关了,在容器里面curl自身localhost是ok的,但奇怪的是在宿主机curl自身加映射好的端口号一点反映都没有
[root@localhost ~]# curl http://localhost:90 curl: (56) Recv failure: Connection reset by peer
然后也各种查资料
确实折腾了好久(断断续续好几天...)定位到--net
参数,同时看了几遍上面那篇《关于vm虚拟机下docker容器不能访问外网问题的解决》终于给我一点提示,下面再贴一下--net
参数的解析(详细docker run参数可以查阅[Docker run 命令](https://www.runoob.com/docker/docker-run-command.html"Docker run 命令"))
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
在默认的网络连接类型下是bridge,会给宿主机添加了一个docker0的网卡信息
于是干脆就指定网络连接类型为host好了,将宿主机的apache停掉,rm掉之前的lnmp容器重新run再浏览器中访问宿主机IP终于能访问上容器的nginx了~
对于非VM环境是不是可以用bridge通过-p映射就可以被访问到了(应该是可以的),这个后续有条件部署到线上我会再更新
总结一下,若宿主机无法访问到容器的端口一般有以下几个排查思路:
- 宿主机的防火墙
- 容器中的相关服务是否已经开启(比如nginx、apache)
- 通过netstat看看宿主机相关端口是否listen中
- 容器中netstat与尝试curl一下自身的服务端口
- 如果上面都没发现问题,尝试使用host连接类型,让容器直接使用宿主机的端口
評論
0沒有任何評論