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

2023-12-07 0 473
目录
  • 问题描述
  • 问题分析
  • 问题解决
  • 总结

问题描述

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

总结

到此这篇关于Docker容器内部无法访问外网原因以及解决办法的文章就介绍到这了,更多相关Docker容器内部无法访问外网内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Linux服务器 Docker容器内部无法访问外网原因以及解决办法 https://www.u-9.cn/server/linux/115912.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务