Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was soll ich tun, wenn Docker den Host nicht anpingen kann?

Was soll ich tun, wenn Docker den Host nicht anpingen kann?

藏色散人
藏色散人Original
2022-01-04 16:58:2712956Durchsuche

Lösungen für das Problem, dass Docker den Host nicht anpingen kann: 1. Ändern Sie daemon.json; 3. Ändern Sie sysctl.conf; 4. Setzen Sie die Netzwerkbrücke zurück.

Was soll ich tun, wenn Docker den Host nicht anpingen kann?

Die Betriebsumgebung dieses Artikels: Ubuntu16.04-System, Docker 20.10.11, Dell G3-Computer.

Was soll ich tun, wenn Docker den Host nicht anpingen kann?

Der Docker-Bridge-Modus kann den Host nicht anpingen In vier Typen unterteilt, ist der Standardwert der einzelne Bridge-Modus, wenn wir ihn nicht festlegen. Der Container verwendet einen unabhängigen Netzwerk-Namespace und ist mit dem docker0 verbunden virtuelle Netzwerkkarte. Kommunizieren Sie mit dem Host über die docker0-Bridge und die Iptables nat-Tabellenkonfiguration.
Testen Sie zu diesem Zeitpunkt auf der Bastion-Maschine und verwenden Sie busybox zum Testen:

# 拉取镜像
docker pull busybox
# 运行容器
docker run -itd --name busy_bridge busybox
 Befehl docker network inspect Bridge, um das Netzwerk anzuzeigen:
Einzelnes Bridge-Netzwerk anzeigen

 Die Netzwerkkonfiguration ist erfolgreich. Geben Sie den Container ein und sehen Sie sich ip an. Sie können sehen, dass ip zugewiesen wurde, aber ping schlägt beim externen Netzwerk fehl und kann keine Verbindung zum externen Netzwerk herstellen Netzwerk:
Single Bridge Network Test  Aber Führen Sie den gleichen Test lokal oder in der Alibaba Cloud durch. Ich habe festgestellt, dass ich eine Verbindung zum Netzwerk herstellen kann. Was ist das Problem?

Problemanalyse:

 Nachdem sie Informationen im Internet gefunden haben, starten viele Leute docker neu und können dann eine Verbindung herstellen. Dies liegt normalerweise daran, dass eine bestimmte Konfiguration geändert wird und der Neustart dann funktioniert hier. Welche Wirkung. Es gibt mehrere allgemeine Änderungen, bitte probieren Sie sie unten einzeln aus:

  1. Docker网络模式分为四种,一般我们不设置时默认为bridge单桥模式,容器使用独立的network Namespace,并连接到docker0虚拟网卡中。通过docker0网桥以及Iptables nat表配置与宿主机通信。
      此时在堡垒机上进行测试,利用busybox进行测试:
    {"bip":"172.16.10.1/24"}

      指令docker network inspect bridge查看网络:
    Was soll ich tun, wenn Docker den Host nicht anpingen kann?

      网路配置成功,进入容器内部,查看ip,可以看到已经分配ip,但是ping外部网络时失败,无法连接外部网络:
    Was soll ich tun, wenn Docker den Host nicht anpingen kann?

      但是在自己本地或者阿里云上进行相同的测试发现能够连通网络,这是什么问题导致的呢?

    问题分析:

      在网上找了一个资料后很多都是重启docker,然后就能连上了,一般是因为修改了某个配置然后重启起作用,这里并没有什么作用。一般修改的分为几种,以下一一试验:

    1. 修改daemon.json

      容器无法访问宿主机是因为网桥分配的网段和宿主机冲突了,需要修改daemon.json进行指定分配,使用指令vim /etc/docker/daemon.json进入后添加:

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

      虽然重启docker并创建容器即可访问,但是,原本堡垒机和容器分配的ip一点冲突也没有,该方法不行。

    1. 关闭防火墙

      容器无法通过网桥访问宿主机,也就无法访问外网,可能是防火墙阻止访问,可以关闭防火墙或者开启某个端口。在服务器上测试,开启防火墙,发现容器确实无法访问百度首页也确实无法访问宿主机,在关闭防火墙并重启docker后,容器就能正常访问了。
      但是,堡垒机上的防火墙原本就是关闭的,该方法也没用。

    1. 修改sysctl.conf

      docker主机内部网络正常,与其它主机的连接失效,其它主机不能连接docker主机上映射的端口,docker内部也无法连接外部主机,利用docker info指令查看信息发现报错如下:

    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

      使用指令vim /etc/sysctl.conf编辑配置文件,在文件中增加以下代码:

    service docker stop

      然后使用指令systemctl restart network重启网络,再次查看docker info,警告消失。但是依旧没有用,堡垒机上的容器还是无法通过网桥访问宿主机,无法访问外网。

    1. 重设网桥

      在使用指令yum install bridge-utils安装工具后,利用brctl show查看网桥,可以发现:
    Was soll ich tun, wenn Docker den Host nicht anpingen kann?
      利用docker network create [网桥名]指令新建网桥发现其生成的bridge id还是8000.0000000000,在新网桥上创建容器,再次查看并没有什么变化,说明很可能是网桥的问题。
      再次测试,此时网桥ip172.17.0.1,容器ip172.0.0.2,发现宿主机能pingÄndern Sie daemon.json

🎜  Der Container kann nicht Zugriff auf den Host Der Host liegt daran, dass das von der Bridge zugewiesene Netzwerksegment mit dem Host-Computer in Konflikt steht. Sie müssen daemon.json ändern, um die Zuteilung anzugeben. Verwenden Sie den Befehl vim /etc/docker /daemon.json Später hinzugefügt: 🎜
brctl addbr br0
🎜  Obwohl es durch einen Neustart von docker und das Erstellen eines Containers zugänglich ist, gibt es überhaupt keinen Konflikt zwischen der ip code> wird vom ursprünglichen Bastion-Host und dem Container zugewiesen, sodass diese Methode nicht funktioniert. 🎜<ol start="2"><li>🎜Schalten Sie die Firewall aus🎜</li></ol>🎜  Der Container kann nicht über die Bridge auf den Host zugreifen und daher nicht auf das externe Netzwerk zugreifen. Die Firewall blockiert möglicherweise Zugriff, damit Sie die Firewall ausschalten oder einen Port öffnen können. Auf dem Server getestet, die Firewall aktiviert und festgestellt, dass der Container tatsächlich nicht auf die Baidu-Homepage und den Host zugreifen konnte. Nach dem Schließen der Firewall und dem Neustart von <code>docker konnte normal auf den Container zugegriffen werden.
 Allerdings ist die Firewall auf dem Bastion-Computer ursprünglich deaktiviert, sodass diese Methode nutzlos ist. 🎜
  1. 🎜Ändern Sie sysctl.conf🎜
🎜 – Das interne Netzwerk des docker-Hosts ist normal und mit anderen Hosts verbunden Die Verbindung ist ungültig, andere Hosts können keine Verbindung zu dem auf dem docker-Host zugeordneten Port herstellen und docker kann intern keine Verbindung zu externen Hosts herstellen code>docker info-Befehl zum Anzeigen der Informationen. Der folgende Fehler wurde gefunden: 🎜
ip addr add 172.16.0.1/24 dev br0
🎜  Verwenden Sie den Befehl vim /etc/sysctl.conf, um die Konfigurationsdatei zu bearbeiten und den folgenden Code hinzuzufügen in die Datei: 🎜
ip link set dev br0 up
🎜   Dann verwenden Sie den Befehl systemctl restart network. Starten Sie das Netzwerk neu und überprüfen Sie erneut docker info, und die Warnung verschwindet. Aber es ist immer noch nutzlos. Der Container auf der Bastion-Maschine kann immer noch nicht über die Brücke auf die Host-Maschine zugreifen und nicht auf das externe Netzwerk zugreifen. 🎜
  1. 🎜Setzen Sie die Brücke zurück🎜
🎜 Nachdem Sie den Befehl yum install bridge-utils verwendet haben, um das Tool zu installieren, verwenden Sie brctl showSehen Sie sich die Netzwerkbrücke an und Sie finden:
Bridge 1
Verwenden Sie den Befehl docker network create [bridge name], um eine neue Bridge zu erstellen und festzustellen, dass die generierte bridge id lautet immer noch 8000.0000000000, erstellen Sie einen Container auf der neuen Brücke und überprüfen Sie es erneut. Es gibt keine Änderung, was darauf hindeutet, dass es sich wahrscheinlich um ein Problem mit der Brücke handelt. <br> Testen Sie erneut. Zu diesem Zeitpunkt ist die Bridge-<code>IP 172.17.0.1 und die Container-IP ist 172.0.0.2 und stellte fest, dass der Host über die Netzwerkbrücke pingen kann, aber keine Verbindung zum Container herstellen kann und der Container keine Verbindung zur Brücke und auch keine Verbindung zum Host herstellen kann, geschweige denn das externe Netzwerk, es muss sich also um die Netzwerkbrücke handeln. 🎜

问题解决

  这里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
Was soll ich tun, wenn Docker den Host nicht anpingen kann?

  修改docker默认网桥:

vim /etc/docker/daemon.json

  添加字段:

"bridge":"br0"

  重启docker

service docker start

  此时查看网桥:
Was soll ich tun, wenn Docker den Host nicht anpingen kann?

  在没有挂载容器前,依旧是8000.000000000000。运行测试容器:

docker run -itd --name busy_test busybox

  查看Was soll ich tun, wenn Docker den Host nicht anpingen kann?:
Was soll ich tun, wenn Docker den Host nicht anpingen kann?

  此时容器挂载在网桥上了,再次查看网桥id
Was soll ich tun, wenn Docker den Host nicht anpingen kann?

  说明已经其作用,进入测试容器内部,Was soll ich tun, wenn Docker den Host nicht anpingen kann?:
Was soll ich tun, wenn Docker den Host nicht anpingen kann?

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

问题补充:

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

推荐学习:《docker视频教程

Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn Docker den Host nicht anpingen kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn