Docker:解决宿主机无法访问docker容器中nginx服务

Docker:解决宿主机无法访问docker容器中nginx服务

1.问题描述

在虚拟机中,部署好docker服务,并且安装了nginx。启动之后,宿主机无发访问容器中的nginx服务,一直转圈圈,但是虚拟机中使用 curl [虚拟机ip] 就可以访问到nginx的启动成功页面。
宿主机无法访问容器中的nginx
在这里插入图片描述

2.问题解决

2.1查看端口号是否映射正确

这里Nginx是主机80端口映射到docker中的80端口
在这里插入图片描述

2.2检查防火墙状态

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

2.3需要进入docker下正在运行中的nginx容器内部启动nginx

[root@localhost ~]# docker exec -it nginx bash
root@6fe8ede3eab4:/# service nginx start
root@6fe8ede3eab4:/# service nginx status
nginx is running.

2.4访问成功

在这里插入图片描述

2.5如果还没有访问成功,有可能你在内核优化的时候 禁止ip转发功能了

  • Linux 默认情况下是不开启 ip 转发功能的,与docker无关。
  • 查看是否开启转发:执行以下命令,结果0为未开启,1为开启
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward 
0
  • 配置linux内核允许转发
[root@localhost ~]# sysctl net.ipv4.conf.all.forwarding=1
net.ipv4.conf.all.forwarding = 1

这个允许ip转发只是暂时的,重启虚拟机后会失效

永久修改方法

[root@localhost ~]# vim /etc/sysctl.conf

找到 net.ipv4.conf.all.forwarding = 0  把0修改成1即可
vim模式下 :/net.ipv4.ip_forward

[root@localhost ~]# sysctl -p /etc/sysctl.conf
-----
[root@localhost ~]# systemctl restart network 

之后你会神奇的发现宿主机可以访问了!

在这里插入图片描述

### 解决 Docker 容器Nginx 端口不能被外部访问的问题 #### 检查并配置防火墙规则 为了确保 Docker 容器Nginx 可以外部访问,需确认防火墙允许所需的端口通信。如果防火墙阻止了特定端口的数据包,则即使正确设置了 Docker 的端口映射,仍然无法实现外部访问。 对于 Linux 系统上的 `firewalld` 防火墙管理工具: - 使用命令查看当前防火墙的状态以及是否正在运行: ```bash systemctl status firewalld ``` - 若要临时停止防火墙以便测试连通性(不建议长期这样做),可以执行以下命令来关闭它: ```bash systemctl stop firewalld.service ``` 然而,在生产环境更推荐的做法是在不影响其他安全策略的前提下添加例外规则而不是完全禁用防火墙。这可以通过向防火墙增加相应的入站规则完成,比如开放 HTTP 或 HTTPS 流量对应的 TCP 端口[^1]。 #### 正确设置 Docker 端口映射 当启动带有 `-p` 参数的 Docker 容器时,实际上就是在定义宿主机容器之间的端口转发关系。例如,要使本地机器上的 8080 端口连接到 Nginx 容器内的第 80 端口,应该这样创建容器实例: ```bash docker run -d -p 8080:80 nginx ``` 这里的关键在于理解 `-p` 后面跟的是 `<host_port>:<container_port>` 形式的参数值对,其第一个数字代表宿主机对外开放的服务监听地址;第二个则是目标应用在各自命名空间里实际占用的位置[^2]。 #### 排除常见错误原因 有时尽管已经按照上述方法进行了适当调整但仍遇到问题,这时可能是因为某些细节处理不当所引起的。例如,默认情况下 Web 浏览器尝试通过标准HTTP协议即TCP/80去请求资源,而如果我们指定了不同的外部端口号如上面例子的 8080 ,那么就需要显式地将其加入 URL 以形成完整的路径,形如 http://your_server_ip:8080 。另外还需注意检查服务器提供商的安全组设置,确保其也放行了相应端口流量[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟未玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值