docker ping不通宿主機的解決辦法:1、修改daemon.json;2、關閉防火墻;3、修改sysctl.conf;4、重設網橋即可。
本文操作環境: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查看網絡:
??網路配置成功,進入容器內部,查看ip,可以看到已經分配ip,但是ping外部網絡時失敗,無法連接外部網絡:
??但是在自己本地或者阿里云上進行相同的測試發現能夠連通網絡,這是什么問題導致的呢?
問題分析:
??在網上找了一個資料后很多都是重啟docker,然后就能連上了,一般是因為修改了某個配置然后重啟起作用,這里并沒有什么作用。一般修改的分為幾種,以下一一試驗:
- 修改daemon.json
??容器無法訪問宿主機是因為網橋分配的網段和宿主機沖突了,需要修改daemon.json進行指定分配,使用指令vim /etc/docker/daemon.json進入后添加:
{"bip":"172.16.10.1/24"}
??雖然重啟docker并創建容器即可訪問,但是,原本堡壘機和容器分配的ip一點沖突也沒有,該方法不行。
- 關閉防火墻
??容器無法通過網橋訪問宿主機,也就無法訪問外網,可能是防火墻阻止訪問,可以關閉防火墻或者開啟某個端口。在服務器上測試,開啟防火墻,發現容器確實無法訪問百度首頁也確實無法訪問宿主機,在關閉防火墻并重啟docker后,容器就能正常訪問了。
??但是,堡壘機上的防火墻原本就是關閉的,該方法也沒用。
- 修改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,警告消失。但是依舊沒有用,堡壘機上的容器還是無法通過網橋訪問宿主機,無法訪問外網。
- 重設網橋
??在使用指令yum install bridge-utils安裝工具后,利用brctl show查看網橋,可以發現:
??利用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默認網橋:
vim /etc/docker/daemon.json
??添加字段:
"bridge":"br0"
??重啟docker:
service docker start
??此時查看網橋:
??在沒有掛載容器前,依舊是8000.000000000000。運行測試容器:
docker run -itd --name busy_test busybox
??查看網橋詳情:
??此時容器掛載在網橋上了,再次查看網橋id:
??說明已經其作用,進入測試容器內部,測試外網:
??成功!
??補充:這里使用docker network新建網橋,沒有用,發現新建網橋掛載容器后,其bridge id依舊不變,沒有起作用,說明堡壘機上的docker network可能存在問題。
問題補充:
??上面的問題是創建自定義網橋,然后在自定義網橋上連接容器a和b,結果宿主機無法ping通a、b,且進入容器內部后,兩個容器無法ping通自定義網絡,但能彼此相通。
??查了很多資料,發現了這篇文章。博主說問題原因是系統內核的網橋模塊bridge.ko加載失敗導致,解決問題的方案是升級內核或升級系統。
??升級centos內核參考這篇。
??升級完成后,重裝Docker,自定義網橋和容器,成功!不再有網絡問題。
推薦學習:《docker視頻教程》