外网不能访问docker容器解决方案

首先外网能够ping通容器的宿主机例如我的容器宿主机是192.168.40.131

C:\Users\jiang>ping 192.168.40.131

正在 Ping 192.168.40.131 具有 32 字节的数据:
来自 192.168.40.131 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.40.131 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.40.131 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.40.131 的回复: 字节=32 时间<1ms TTL=64

192.168.40.131 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\jiang>

为了方便实验的进程建议关闭防火墙以及selinux

[root@linux ~]# systemctl stop firewalld.service
[root@linux ~]# systemctl disable firewalld.service
[root@linux ~]# sed -ri '/SELINUX=enforcing/cSELINUX=disabled' /etc/sysconfig/selinux
[root@linux ~]# setenforce 0

开启linux的包转发功能

[root@linux ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@linux ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@linux ~]#

在docker中测试端口映射

[root@linux ~]# docker run -d --name tomcat02 -p 9527:8080 tomcat:latest

我们会发现tomcat访问没得权限,那是因为Tomcat是最小化的内容

[root@linux ~]# docker exec -it tomcat02 /bin/bash
root@2cb65acbee53:/usr/local/tomcat# ls -l
total 136
-rw-r--r--. 1 root root 18982 Apr  3 12:06 BUILDING.txt
-rw-r--r--. 1 root root  5409 Apr  3 12:06 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Apr  3 12:06 LICENSE
-rw-r--r--. 1 root root  2333 Apr  3 12:06 NOTICE
-rw-r--r--. 1 root root  3255 Apr  3 12:06 README.md
-rw-r--r--. 1 root root  6898 Apr  3 12:06 RELEASE-NOTES
-rw-r--r--. 1 root root 16262 Apr  3 12:06 RUNNING.txt
drwxr-xr-x. 2 root root  4096 Apr 24 23:49 bin
drwxr-xr-x. 3 root root  4096 May 23 08:41 conf
drwxr-xr-x. 2 root root    78 Apr 24 23:49 include
drwxr-xr-x. 2 root root  4096 Apr 24 23:49 lib
drwxrwxrwx. 2 root root  4096 May 23 08:41 logs
drwxr-xr-x. 3 root root  4096 Apr 24 23:49 native-jni-lib
drwxrwxrwx. 2 root root    30 Apr 24 23:49 temp
drwxr-xr-x. 2 root root     6 Apr 24 23:49 webapps
drwxr-xr-x. 7 root root    81 Apr  3 12:04 webapps.dist
drwxrwxrwx. 2 root root     6 Apr  3 12:02 work
root@2cb65acbee53:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@2cb65acbee53:/usr/local/tomcat#

最后访问
在这里插入图片描述
docker 出现

[root@docker ~]# docker run --name centos-bbs -it -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:centos6.9
WARNING: IPv4 forwarding is disabled. Networking will not work.

解决方案

[root@docker ~]# echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
[root@docker ~]# systemctl restart network && systemctl restart docker

测试

[root@docker ~]#
[root@docker ~]# docker rm -f $(docker ps -qa)
c1c50dce5366
[root@docker ~]# docker run --name centos-bbs -it -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:centos6.9
[root@2325579ccff8 /]#
### 配置 Docker 容器以实现外网访问 为了使 Docker 容器能够正常访问外部网络,通常情况下默认设置已经足够。然而当遇到无法访问的情况时,可能是因为一些特定配置未被正确设定。 #### 检查并启用 Net 转发功能 如果宿主机防火墙没有开启 net 转发,则可能导致容器无法访问外部网络。可以通过命令来确认防火墙是否启用了 masquerading (即 NAT 功能),这一步骤对于确保容器可以顺利访问互联网至关重要[^3]: ```bash firewall-cmd --query-masquerade ``` 若返回 `no` 表明尚未开启此特性,那么应该执行如下操作来进行激活: ```bash firewall-cmd --add-masquerade --permanent firewall-cmd --reload ``` 上述指令会永久性地向公共区域添加伪装规则,并重新加载防火墙配置使之生效。 #### 重建 docker0 网络接口 有时重置整个 Docker 的网络结构也能解决问题。停止 Docker 服务之后清除所有现存的 NAT 规则以及移除旧有的 docker0 接口可以帮助恢复正常的网络通信路径[^2]: ```bash sudo service docker stop sudo pkill docker sudo iptables -t nat -F sudo ifconfig docker0 down sudo brctl delbr docker0 sudo service docker start ``` 这些命令将会清理掉任何潜在干扰因素,并让 Docker 自动创建新的干净状态下的 docker0 网桥设备用于后续新启动容器间的通讯及对外部资源的请求转发处理。 完成以上任一方案后,应当测试一下容器内的应用程序能否成功发起针对公网地址的服务调用或数据交换活动;一般而言,只要按照上述指导进行了适当调整,大多数场景下都能够有效改善甚至彻底解决此类连通性的障碍问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值