docker 容器无法连接外网

本文详细介绍了如何解决Docker容器无法连接外网的问题,包括设置防火墙规则以允许特定端口通信,如SSH(22端口)、HTTP(80端口),以及与DNS服务器的数据通信。同时,提供了测试容器网络吞吐量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q:docker run -itd --name=NAME --net host IMAGE bash  启动容器后,容器中无法连接外网

A:进入容器 docker exec -ti [NAMES] /bin/bash

设置防火墙

  1. 使用命令iptables  -n -L  可以查看当前防火墙的状态以及规则

  2. 由上面的可以看到防火墙都没有配置,都是空的。如果大家要清空自己的防火墙配置可以用命令

  3. 启用防火墙配置,当然首先要允许远程,我本地的远程端口没有改到,建议改的。

    iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

  4. 除了远程,我们还有其它的端口是需要开放使用的,例如做网站服务器的,还需要开放80 端口。

     iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

  5. 因为服务器要使用DNS解析,所以还要允许服务器与DNS服务器之间的数据通信,直接允许那个IP 可以了。我使用的DNS 是  114.114.114.114

    iptables -A INPUT -s 114.114.114.114 -j ACCEPT

    iptables -A OUTPUT -d 114.114.114.114 -j ACCEPT

  6. 以上是我服务器允许开放的端口都允许通过了,最后其它的都禁止就可以了。

    最后 保存iptables的规则,我个人的服务器里边不需要其它的操作,所以只是做简单的规则就可以了。

    service iptables save

 

ps:

或者关闭防火墙,防火墙在关闭后,需要重启宿主机,至少重启docker服务。

原因:防火墙的起、停、刷新这类行为会导致清空 Docker 设置的网络规则,而导致容器内的网络无法和外部互联。

 

如果想要测试某个容器的网络吞吐量,可以写一个死循环的脚本,比如:

while(true)

do 

wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.79/bin/apache-tomcat-7.0.79.tar.gz

sleep 10

done

然后打开另一个shell窗口,在容器外面使用命令 docker stats 可以查看每个运行中的容器的网络流量.

转载于:https://my.oschina.net/jack088/blog/3007769

### 解决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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值