解决Docker端口映射后外网无法访问的问题

一、前言

今天因为服务器宕机,重新启动后发现docker部署的mysqlredis都无法通过外网访问。经过排查原因是ip转发没有开启。下面教大家如何解决

二、问题排查

(1) 查看防火墙运行情况

使用firewall-cmd --state
如果防火墙处于not running,则可以排除防火墙阻断请求的可能。
如果输出防火墙处于running则表示防火墙正在运行,需进行下一步排查

(2) 查看防火墙开放了哪些端口和服务。

使用firewall-cmd --list-portsfirewall-cmd --list-services,查看是否开放了我们需要访问的端口

(3)查看ip转发是否开启

通过cat /proc/sys/net/ipv4/ip_forward查看ip转发是否开启。
如果该值为0则需要配置其开启

通过以下方法进行开启

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf 

重新加载并让修改生效。

 sudo sysctl -p

我的属于第三种
在这里插入图片描述

三、参考

排查Docker端口映射后外部无法访问的问题

### 解决Docker容器外网访问的方法 为了使Docker容器能够访问外部网络,通常有几种方法可以实现这一目标。默认情况下,Docker 容器已经具备了一定程度上的外网访问能力,这是因为 Docker 使用了宿主机的网络命名空间并创建了一个名为 `docker0` 的虚拟桥接设备[^1]。 然而,在某些特定场景下可能需要更复杂的配置来满足需求: #### 方法一:利用Host模式 在启动容器时指定`--network host`参数可以让容器共享宿主机的网络栈,从而获得与宿主机相同的IP地址和端口映射规则。这种方法简单直接,但是可能会带来安全风险以及端口冲突等问题[^2]。 ```bash docker run --network host my_image ``` #### 方法二:自定义Bridge网络 除了默认的bridge网络之外,还可以创建自己的用户定义 bridge 网络,并将容器连接到这个新网络上。这样做的好处是可以更好地控制容器之间的通信行为,并且不会受到原有NAT机制的影响[^3]。 ```bash # 创建一个新的bridge网络 docker network create my_bridge_network # 启动容器并将它加入到新建的bridge网络中 docker run --name=my_container --network=my_bridge_network -d nginx ``` #### 方法三:Macvlan 或 IPvlan 网络驱动 对于那些希望让多个容器拥有独立的真实 IP 地址的应用来说,macvlan 和 ipvlan 是两个不错的选择。它们允许容器直接接入物理交换机或路由器,就像普通的VM一样工作[^4]。 ```bash # 创建一个基于eth0接口的macvlan网络 docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 my_macvlan_net # 将容器连入此macvlan网络 docker run --net=my_macvlan_net -it alpine ash ``` 上述三种方式都可以有效地解决Docker容器外部互联网的访问问题,具体采用哪种取决于实际应用场景和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韭菜盖饭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值