docker ping不通宿主機的解決辦法:1、修改daemon.json;2、關(guān)閉防火墻;3、修改sysctl.conf;4、重設(shè)網(wǎng)橋即可。
本文操作環(huán)境:ubuntu16.04系統(tǒng)、Docker 20.10.11、Dell G3電腦。
docker ping不通宿主機怎么辦?
Docker網(wǎng)橋模式ping不通宿主機
問題描述:
??Docker
網(wǎng)絡(luò)模式分為四種,一般我們不設(shè)置時默認為bridge
單橋模式,容器使用獨立的network Namespace
,并連接到docker0
虛擬網(wǎng)卡中。通過docker0
網(wǎng)橋以及Iptables nat
表配置與宿主機通信。
??此時在堡壘機上進行測試,利用busybox
進行測試:
# 拉取鏡像 docker pull busybox # 運行容器 docker run -itd --name busy_bridge busybox
??指令docker network inspect bridge
查看網(wǎng)絡(luò):
??網(wǎng)路配置成功,進入容器內(nèi)部,查看ip
,可以看到已經(jīng)分配ip
,但是ping
外部網(wǎng)絡(luò)時失敗,無法連接外部網(wǎng)絡(luò):
??但是在自己本地或者阿里云上進行相同的測試發(fā)現(xiàn)能夠連通網(wǎng)絡(luò),這是什么問題導(dǎo)致的呢?
問題分析:
??在網(wǎng)上找了一個資料后很多都是重啟docker
,然后就能連上了,一般是因為修改了某個配置然后重啟起作用,這里并沒有什么作用。一般修改的分為幾種,以下一一試驗:
- 修改
daemon.json
??容器無法訪問宿主機是因為網(wǎng)橋分配的網(wǎng)段和宿主機沖突了,需要修改daemon.json
進行指定分配,使用指令vim /etc/docker/daemon.json
進入后添加:
{"bip":"172.16.10.1/24"}
??雖然重啟docker
并創(chuàng)建容器即可訪問,但是,原本堡壘機和容器分配的ip
一點沖突也沒有,該方法不行。
- 關(guān)閉防火墻
??容器無法通過網(wǎng)橋訪問宿主機,也就無法訪問外網(wǎng),可能是防火墻阻止訪問,可以關(guān)閉防火墻或者開啟某個端口。在服務(wù)器上測試,開啟防火墻,發(fā)現(xiàn)容器確實無法訪問百度首頁也確實無法訪問宿主機,在關(guān)閉防火墻并重啟docker
后,容器就能正常訪問了。
??但是,堡壘機上的防火墻原本就是關(guān)閉的,該方法也沒用。
- 修改
sysctl.conf
??docker
主機內(nèi)部網(wǎng)絡(luò)正常,與其它主機的連接失效,其它主機不能連接docker
主機上映射的端口,docker
內(nèi)部也無法連接外部主機,利用docker info
指令查看信息發(fā)現(xiàn)報錯如下:
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
重啟網(wǎng)絡(luò),再次查看docker info
,警告消失。但是依舊沒有用,堡壘機上的容器還是無法通過網(wǎng)橋訪問宿主機,無法訪問外網(wǎng)。
- 重設(shè)網(wǎng)橋
??在使用指令yum install bridge-utils
安裝工具后,利用brctl show
查看網(wǎng)橋,可以發(fā)現(xiàn):
??利用docker network create [網(wǎng)橋名]
指令新建網(wǎng)橋發(fā)現(xiàn)其生成的bridge id
還是8000.0000000000
,在新網(wǎng)橋上創(chuàng)建容器,再次查看并沒有什么變化,說明很可能是網(wǎng)橋的問題。
??再次測試,此時網(wǎng)橋ip
為172.17.0.1
,容器ip
為172.0.0.2
,發(fā)現(xiàn)宿主機能ping
通網(wǎng)橋,但是無法連接容器,而容器無法連接網(wǎng)橋,無法連接宿主機,更別談外網(wǎng)了,所以這里可以肯定是網(wǎng)橋出了問題。
問題解決
??這里docker network
生成新的網(wǎng)橋不行,說明docker
的network
存在問題,我們利用剛才下載的bridge-utils
來創(chuàng)建網(wǎng)橋。
??首先暫停docker
服務(wù),利用指令:
service docker stop
??添加網(wǎng)橋:
brctl addbr br0
??添加ip
字段:
ip addr add 172.16.0.1/24 dev br0
??啟用網(wǎng)橋br0
:
ip link set dev br0 up
??查看網(wǎng)絡(luò)br0
:
??修改docker
默認網(wǎng)橋:
vim /etc/docker/daemon.json
??添加字段:
"bridge":"br0"
??重啟docker
:
service docker start
??此時查看網(wǎng)橋:
??在沒有掛載容器前,依舊是8000.000000000000
。運行測試容器:
docker run -itd --name busy_test busybox
??查看網(wǎng)橋詳情:
??此時容器掛載在網(wǎng)橋上了,再次查看網(wǎng)橋id
:
??說明已經(jīng)其作用,進入測試容器內(nèi)部,測試外網(wǎng):
??成功!
??補充:這里使用docker network
新建網(wǎng)橋,沒有用,發(fā)現(xiàn)新建網(wǎng)橋掛載容器后,其bridge id
依舊不變,沒有起作用,說明堡壘機上的docker network
可能存在問題。
問題補充:
??上面的問題是創(chuàng)建自定義網(wǎng)橋,然后在自定義網(wǎng)橋上連接容器a
和b
,結(jié)果宿主機無法ping
通a
、b
,且進入容器內(nèi)部后,兩個容器無法ping
通自定義網(wǎng)絡(luò),但能彼此相通。
??查了很多資料,發(fā)現(xiàn)了這篇文章。博主說問題原因是系統(tǒng)內(nèi)核的網(wǎng)橋模塊bridge.ko
加載失敗導(dǎo)致,解決問題的方案是升級內(nèi)核或升級系統(tǒng)。
??升級centos
內(nèi)核參考這篇。
??升級完成后,重裝Docker
,自定義網(wǎng)橋和容器,成功!不再有網(wǎng)絡(luò)問題。
推薦學習:《docker視頻教程》