docker ping不通宿主機怎么辦

docker ping不通宿主機的解決辦法:1、修改daemon.json;2、關閉防火墻;3、修改sysctl.conf;4、重設網橋即可。

docker ping不通宿主機怎么辦

本文操作環境:ubuntu16.04系統、Docker 20.10.11、Dell G3電腦。

docker ping不通宿主機怎么辦?

Docker網橋模式ping不通宿主機

問題描述:

??Docker網絡模式分為四種,一般我們不設置時默認為bridge單橋模式,容器使用獨立的network Namespace,并連接到docker0虛擬網卡中。通過docker0網橋以及Iptables nat表配置與宿主機通信。
??此時在堡壘機上進行測試,利用busybox進行測試:

# 拉取鏡像 docker pull busybox # 運行容器 docker run -itd --name busy_bridge busybox

??指令docker network inspect bridge查看網絡:
docker ping不通宿主機怎么辦

??網路配置成功,進入容器內部,查看ip,可以看到已經分配ip,但是ping外部網絡時失敗,無法連接外部網絡:
docker ping不通宿主機怎么辦

??但是在自己本地或者阿里云上進行相同的測試發現能夠連通網絡,這是什么問題導致的呢?

問題分析:

??在網上找了一個資料后很多都是重啟docker,然后就能連上了,一般是因為修改了某個配置然后重啟起作用,這里并沒有什么作用。一般修改的分為幾種,以下一一試驗:

  1. 修改daemon.json

??容器無法訪問宿主機是因為網橋分配的網段和宿主機沖突了,需要修改daemon.json進行指定分配,使用指令vim /etc/docker/daemon.json進入后添加:

{"bip":"172.16.10.1/24"}

??雖然重啟docker并創建容器即可訪問,但是,原本堡壘機和容器分配的ip一點沖突也沒有,該方法不行。

  1. 關閉防火墻

??容器無法通過網橋訪問宿主機,也就無法訪問外網,可能是防火墻阻止訪問,可以關閉防火墻或者開啟某個端口。在服務器上測試,開啟防火墻,發現容器確實無法訪問百度首頁也確實無法訪問宿主機,在關閉防火墻并重啟docker后,容器就能正常訪問了。
??但是,堡壘機上的防火墻原本就是關閉的,該方法也沒用。

  1. 修改sysctl.conf

??docker主機內部網絡正常,與其它主機的連接失效,其它主機不能連接docker主機上映射的端口,docker內部也無法連接外部主機,利用docker info指令查看信息發現報錯如下:

WARNING: IPv4 forwarding is disabled WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled

??使用指令vim /etc/sysctl.conf編輯配置文件,在文件中增加以下代碼:

net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-arptables=1 net.ipv4.ip_forward=1

??然后使用指令systemctl restart network重啟網絡,再次查看docker info,警告消失。但是依舊沒有用,堡壘機上的容器還是無法通過網橋訪問宿主機,無法訪問外網。

  1. 重設網橋

??在使用指令yum install bridge-utils安裝工具后,利用brctl show查看網橋,可以發現:
docker ping不通宿主機怎么辦
??利用docker network create [網橋名]指令新建網橋發現其生成的bridge id還是8000.0000000000,在新網橋上創建容器,再次查看并沒有什么變化,說明很可能是網橋的問題。
??再次測試,此時網橋ip為172.17.0.1,容器ip為172.0.0.2,發現宿主機能ping通網橋,但是無法連接容器,而容器無法連接網橋,無法連接宿主機,更別談外網了,所以這里可以肯定是網橋出了問題。

問題解決

??這里docker network生成新的網橋不行,說明docker的network存在問題,我們利用剛才下載的bridge-utils來創建網橋。
??首先暫停docker服務,利用指令:

service docker stop

??添加網橋:

brctl addbr br0

??添加ip字段:

ip addr add 172.16.0.1/24 dev br0

??啟用網橋br0:

ip link set dev br0 up

??查看網絡br0:
docker ping不通宿主機怎么辦

??修改docker默認網橋:

vim /etc/docker/daemon.json

??添加字段:

"bridge":"br0"

??重啟docker:

service docker start

??此時查看網橋:
docker ping不通宿主機怎么辦

??在沒有掛載容器前,依舊是8000.000000000000。運行測試容器:

docker run -itd --name busy_test busybox

??查看網橋詳情:
docker ping不通宿主機怎么辦

??此時容器掛載在網橋上了,再次查看網橋id:
docker ping不通宿主機怎么辦

??說明已經其作用,進入測試容器內部,測試外網:
docker ping不通宿主機怎么辦

??成功!
??補充:這里使用docker network新建網橋,沒有用,發現新建網橋掛載容器后,其bridge id依舊不變,沒有起作用,說明堡壘機上的docker network可能存在問題。

問題補充:

??上面的問題是創建自定義網橋,然后在自定義網橋上連接容器a和b,結果宿主機無法ping通a、b,且進入容器內部后,兩個容器無法ping通自定義網絡,但能彼此相通。
??查了很多資料,發現了這篇文章。博主說問題原因是系統內核的網橋模塊bridge.ko加載失敗導致,解決問題的方案是升級內核或升級系統。
??升級centos內核參考這篇。
??升級完成后,重裝Docker,自定義網橋和容器,成功!不再有網絡問題。

推薦學習:《docker視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享