https://paperen.com/file/210

在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的网卡信息

https://paperen.com/file/209

于是干脆就指定网络连接类型为host好了,将宿主机的apache停掉,rm掉之前的lnmp容器重新run再浏览器中访问宿主机IP终于能访问上容器的nginx了~

对于非VM环境是不是可以用bridge通过-p映射就可以被访问到了(应该是可以的),这个后续有条件部署到线上我会再更新

总结一下,若宿主机无法访问到容器的端口一般有以下几个排查思路:

  • 宿主机的防火墙
  • 容器中的相关服务是否已经开启(比如nginx、apache)
  • 通过netstat看看宿主机相关端口是否listen中
  • 容器中netstat与尝试curl一下自身的服务端口
  • 如果上面都没发现问题,尝试使用host连接类型,让容器直接使用宿主机的端口