欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

Docker容器内部无法访问外网原因以及解决办法

时间:2025-12-10 16:30:06|栏目:其它服务器|点击:

目录
  • 问题描述
  • 问题分析
  • 问题解决
  • 总结

问题描述

部署了一个Docker环境,宿主机可以访问Internet,启动了一个容器发现容器里的服务无法访问Internet,Docker网络使用的是桥接(bridge)模式。

问题分析

使用Docker桥接模式启动的容器,宿主机如果可以访问外网,按理来说Docker容器本身也可以访问外网的。其原理:容器网卡与宿主机的docker0网桥互联,在通过nat的转换,通过宿主机的网卡,连接到外网。那可以初步判断容器内部访问不了外网,可能是某些配置的原因。

问题解决

检查docker bridge网络配置:

# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "52d99eec11c4706581e4b8235613d5258ef2c318557baddbb79766136d7b0868",
        "Created": "2022-10-22T19:31:19.358514137+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "false",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

发现:com.docker.network.bridge.enable_ip_masquerade值为false,代表是否开启IP伪装,false代表未开启。

查看docker服务启动命令:

#ps -ef|grep dockerd
root     15273     1  6 11:35 ?        00:14:25 /usr/bin/dockerd --iptables=false --exec-opt native.cgroupdriver=systemd --data-root=/var/lib/docker --log-opt max-size=50m --log-opt max-file=5

发现参数:--iptables=false,查阅docker官网:

Docker容器内部无法访问外网原因以及解决办法

 大概意思是否禁止docker进程添加iptables规则,false代表禁止,禁止后即使开启IP伪装也不生效。可以猜到就是这个参数搞的问题。

Docker服务是yum install部署的,可能有些参数读取的一些预先定义的包环境变量里。

让我们将--iptables改为true,最简单的方式就是覆盖原启动命令中的参数,在docker启动命令最后添加--iptables=true:

# vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target  containerd.service
BindsTo=containerd.service
[Service]
Type=notify
Environment=GOTRACEBACK=crash
ExecReload=/bin/kill -s HUP $MAINPID
Delegate=yes
KillMode=process
ExecStart=/usr/bin/dockerd \

          $DOCKER_OPTS \

          $DOCKER_STORAGE_OPTIONS \

          $DOCKER_DNS_OPTIONS \

          --ip-masq=true \

          --iptables=true
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=1min
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

然后重启docker进程: 

# systemctl daemon-reload
# systemctl restart docker

然后发现,容器内部可以访问外网了~~~

参考资料:dockerd | Docker Documentation

---------------------------------------------------------------------------------------------------

查阅官网发现:iptables默认值是true的,应该是yum源下载的包里启动命令加了这个参数而且改成了false,这也是导致容器内部无法访问外网的原因之一。

总结

上一篇:Linux服务器和docker时区修改问题

栏    目:其它服务器

下一篇:docker容器/etc/hosts文件修改方法

本文标题:Docker容器内部无法访问外网原因以及解决办法

本文地址:https://zz.feitang.co/server/29888.html

广告投放 | 联系我们 | 版权申明

申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:257218569 | 邮箱:257218569@qq.com

Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号