首頁 >運維 >Docker >docker ping不通宿主機怎麼辦

docker ping不通宿主機怎麼辦

藏色散人
藏色散人原創
2022-01-04 16:58:2713117瀏覽

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,在新網橋上建立容器,再次查看並沒有什麼變化,說明很可能是網橋的問題。
  再次​​測試,此時網橋ip172.17.0.1,容器ip172.0.0.2,發現宿主功能ping通網橋,但是無法連接容器,而容器無法連接網橋,無法連接宿主機,更別談外網了,所以這裡可以肯定是網橋出了問題。

问题解决

  这里docker network生成新的网桥不行,说明dockernetwork存在问题,我们利用刚才下载的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不通宿主機怎麼辦:
docker ping不通宿主機怎麼辦

  此时容器挂载在网桥上了,再次查看网桥id
docker ping不通宿主機怎麼辦

  说明已经其作用,进入测试容器内部,docker ping不通宿主機怎麼辦:
docker ping不通宿主機怎麼辦

  成功!
  补充:这里使用docker network新建网桥,没有用,发现新建网桥挂载容器后,其bridge id依旧不变,没有起作用,说明堡垒机上的docker network可能存在问题。

问题补充:

  上面的问题是创建自定义网桥,然后在自定义网桥上连接容器ab,结果宿主机无法pingab,且进入容器内部后,两个容器无法ping通自定义网络,但能彼此相通。
  查了很多资料,发现了这篇文章。博主说问题原因是系统内核的网桥模块bridge.ko加载失败导致,解决问题的方案是升级内核或升级系统。
  升级centos内核参考这篇。
  升级完成后,重装Docker,自定义网桥和容器,成功!不再有网络问题。

推荐学习:《docker视频教程

以上是docker ping不通宿主機怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn