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

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/
目录问题描述问题分析问题解决总结

问题描述

部署了一个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,这也是导致容器内部无法访问外网的原因之一。

总结

免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容