Docker容器內(nèi)部無法訪問外網(wǎng)原因以及解決辦法
問題描述
部署了一個Docker環(huán)境,宿主機可以訪問Internet,啟動了一個容器發(fā)現(xiàn)容器里的服務無法訪問Internet,Docker網(wǎng)絡使用的是橋接(bridge)模式。
問題分析
使用Docker橋接模式啟動的容器,宿主機如果可以訪問外網(wǎng),按理來說Docker容器本身也可以訪問外網(wǎng)的。其原理:容器網(wǎng)卡與宿主機的docker0網(wǎng)橋互聯(lián),在通過nat的轉(zhuǎn)換,通過宿主機的網(wǎng)卡,連接到外網(wǎng)。那可以初步判斷容器內(nèi)部訪問不了外網(wǎng),可能是某些配置的原因。
問題解決
檢查docker bridge網(wǎng)絡配置:
# 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": {} } ]
發(fā)現(xiàn):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
發(fā)現(xiàn)參數(shù):--iptables=false,查閱docker官網(wǎng):
大概意思是否禁止docker進程添加iptables規(guī)則,false代表禁止,禁止后即使開啟IP偽裝也不生效。可以猜到就是這個參數(shù)搞的問題。
Docker服務是yum install部署的,可能有些參數(shù)讀取的一些預先定義的包環(huán)境變量里。
讓我們將--iptables改為true,最簡單的方式就是覆蓋原啟動命令中的參數(shù),在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
然后發(fā)現(xiàn),容器內(nèi)部可以訪問外網(wǎng)了~~~
參考資料:dockerd | Docker Documentation
---------------------------------------------------------------------------------------------------
查閱官網(wǎng)發(fā)現(xiàn):iptables默認值是true的,應該是yum源下載的包里啟動命令加了這個參數(shù)而且改成了false,這也是導致容器內(nèi)部無法訪問外網(wǎng)的原因之一。
總結
到此這篇關于Docker容器內(nèi)部無法訪問外網(wǎng)原因以及解決辦法的文章就介紹到這了,更多相關Docker容器內(nèi)部無法訪問外網(wǎng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于Docker部署postgresql數(shù)據(jù)庫的問題
這篇文章主要介紹了Docker部署postgresql數(shù)據(jù)庫的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03