最近在准备做项目时,在Docker部署服务时出现了问题。使用Docker部署的服务,宿主机无法进行访问。
这方面的原因有很多,需要进行逐一排查。
测试
安装nginx
docker pull nginx
docker images
运行nginx
docker run -p8080:80 --name=nginx_tmp -d nginx
宿主机进行通过浏览器访问
localhost:8080
,如果访问成功说明docker网络环境没问题,很大概率是容器和镜像的配置问题。
基础问题
确保宿主机网络可以正常使用、是否进行端口映射等等。这类通常都是简单的问题,通常是忘记设置等原因,但我当前的原因却不是。
进阶问题
这方面的原因主要涉及到Docker网络问题。Docker共有四种网络模式:host、bride(桥接模式,默认模式)、container、none。其中host、bridge是我们常用的模式。当
docker run --net=host ...
(这个命令让容器与宿主机共享网络命名空间,这样容器就可以直接使用宿主机的IP地址进行访问),指定网络模式后才会进行更改,默认则采用桥接模式,ip地址通常为:172.17.0.2、172.17.0.3、172.17.0.4等等。可以通过
docker inspect 容器名称
查看对应的ip地址。
docker容器具体的网络配置见6 张图详解 Docker 容器网络配置
我的首先检查网络模式为桥接模式
通过宿主机IP地址+端口进行访问,无效。使用ip地址172.17.0.1+端口访问,无效。改用host网络模式重新部署,通过宿主机IP地址+端口进行访问,成功。
下面是一些解决方案,我是通过重启docker进行解决的(估计出现了bug)。
重启docker
systemctl restart docker
众所周知:重启解决99.99的问题。
关闭防火墙
如果你使用虚拟机作为docker的宿主机,可能因为防火墙的问题,导致虚拟机上的docker无法被访问到。那么直接关闭防火墙进行访问试试。
systemctl stop ufw
更改为host网络模式访问
- 查看IP地址
docker inspect 容器名 |grep"IPAddress"
- 更改网络模式为host模式
docker network disconnect bridge 容器名
docker network connect host 容器名
- 重新启动容器
docker start 容器名
或者重新创建并运行一个容器,添加–net=host选项
docker start -p8090:80 --net=host ...
版权归原作者 MiracleStep 所有, 如有侵权,请联系我们删除。