Maison  >  Article  >  Opération et maintenance  >  Que dois-je faire si Docker ne peut pas envoyer une requête ping à l'hôte ?

Que dois-je faire si Docker ne peut pas envoyer une requête ping à l'hôte ?

藏色散人
藏色散人original
2022-01-04 16:58:2713037parcourir

Solutions au problème selon lequel Docker ne peut pas envoyer de requête ping à l'hôte : 1. Modifiez daemon.json ; 2. Désactivez le pare-feu 3. Modifiez sysctl.conf ; 4. Réinitialisez le pont réseau.

Que dois-je faire si Docker ne peut pas envoyer une requête ping à l'hôte ?

L'environnement d'exploitation de cet article : système ubuntu16.04, Docker 20.10.11, ordinateur Dell G3.

Que dois-je faire si Docker ne peut pas envoyer de requête ping à l'hôte ?

Le mode pont Docker ne peut pas envoyer de requête ping à l'hôte

Description du problème :

DockerLe mode réseau est divisé en quatre types, généralement le mode par défaut est bridge pont unique lorsque nous ne le définissons pas. Le conteneur utilise un espace de noms de réseau indépendant et est connecté au docker0. carte réseau virtuelle. Communiquez avec l'hôte via le pont docker0 et la configuration de la table Iptables nat.
À ce moment, testez sur la machine bastion et utilisez busybox pour tester : Docker网络模式分为四种,一般我们不设置时默认为bridge单桥模式,容器使用独立的network Namespace,并连接到docker0虚拟网卡中。通过docker0网桥以及Iptables nat表配置与宿主机通信。
  此时在堡垒机上进行测试,利用busybox进行测试:

# 拉取镜像
docker pull busybox
# 运行容器
docker run -itd --name busy_bridge busybox

  指令docker network inspect bridge查看网络:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

  网路配置成功,进入容器内部,查看ip,可以看到已经分配ip,但是ping外部网络时失败,无法连接外部网络:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

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

问题分析:

  在网上找了一个资料后很多都是重启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查看网桥,可以发现:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?
  利用docker network create [网桥名]指令新建网桥发现其生成的bridge id还是8000.0000000000,在新网桥上创建容器,再次查看并没有什么变化,说明很可能是网桥的问题。
  再次测试,此时网桥ip172.17.0.1,容器ip172.0.0.2,发现宿主机能ping

service docker stop
 Commandez docker network inspect bridge pour afficher le réseau :
Afficher le réseau à pont unique🎜🎜 La configuration réseau est réussie, entrez dans le conteneur et affichezip, vous pouvez voir que ip a été attribué, mais ping échoue sur le réseau externe et ne peut pas se connecter au réseau externe réseau :
Test de réseau à pont unique🎜🎜  Mais effectuez le même test localement ou sur Alibaba Cloud. J'ai constaté que je pouvais me connecter au réseau. Quel est le problème ? 🎜🎜Analyse du problème : 🎜🎜 Après avoir trouvé des informations sur Internet, de nombreuses personnes redémarrent docker et peuvent ensuite se connecter. C'est généralement parce qu'une certaine configuration est modifiée et que le redémarrage fonctionne. Ce n'est pas le cas. ici. Quel effet. Il existe plusieurs modifications générales, veuillez les essayer une par une ci-dessous :
🎜
  1. 🎜Modifier daemon.json🎜
🎜  Le conteneur ne peut pas accéder à l'hôte L'hôte est dû au fait que le segment de réseau alloué par le pont est en conflit avec la machine hôte. Vous devez modifier daemon.json pour spécifier l'allocation. /daemon.json à saisir plus tard : 🎜
brctl addbr br0
🎜  Bien qu'il soit accessible en redémarrant docker et en créant un conteneur, il n'y a aucun conflit entre l'ip code> attribué par l'hôte bastion d'origine et le conteneur, cette méthode ne fonctionne donc pas. 🎜<ol start="2"><li>🎜Désactivez le pare-feu🎜</li></ol>🎜  Le conteneur ne peut pas accéder à l'hôte via le pont et ne peut donc pas accéder au réseau externe. Le pare-feu est peut-être bloquant. accès, afin que vous puissiez désactiver le pare-feu ou ouvrir un port. Testé sur le serveur, activé le pare-feu et constaté que le conteneur n'était effectivement pas en mesure d'accéder à la page d'accueil de Baidu et à l'hôte. Après avoir fermé le pare-feu et redémarré <code>docker, le conteneur était accessible normalement.
 Cependant, le pare-feu de la machine bastion est initialement désactivé, cette méthode est donc inutile. 🎜
  1. 🎜Modifier sysctl.conf🎜
🎜  dockerLe réseau interne de l'hôte est normal et connecté à d'autres hôtes La connexion n'est pas valide, les autres hôtes ne peuvent pas se connecter au port mappé sur l'hôte docker et docker ne peut pas se connecter aux hôtes externes en interne. Utilisez le . Commande >docker info pour afficher les informations. L'erreur suivante a été trouvée : 🎜
ip addr add 172.16.0.1/24 dev br0
🎜  Utilisez la commande vim /etc/sysctl.conf pour modifier le fichier de configuration et ajouter le code suivant. le fichier : 🎜
ip link set dev br0 up
🎜   Utilisez ensuite la commande systemctl restart network Redémarrez le réseau et vérifiez à nouveau les docker info, et l'avertissement disparaît. Mais c'est toujours inutile. Le conteneur sur la machine bastion ne peut toujours pas accéder à la machine hôte via le pont et ne peut pas accéder au réseau externe. 🎜
  1. 🎜Réinitialiser le pont🎜
🎜 Après avoir utilisé la commande yum install bridge-utils pour installer l'outil, utilisez brctl showVoir le pont réseau et vous pouvez trouver :
Bridge 1
Utilisez la commande docker network create [bridge name] pour créer un nouveau pont et constatez que l'bridge id généré est toujours 8000.0000000000, créez un conteneur sur le nouveau pont, et vérifiez à nouveau et il n'y a aucun changement, indiquant qu'il s'agit probablement d'un problème avec le pont. <br> Testez à nouveau. À ce stade, le pont <code>ip est 172.17.0.1 et le conteneur ip est 172.0.0.2. , et j'ai constaté que l'hôte peut pinger via le pont réseau, mais ne peut pas se connecter au conteneur, et que le conteneur ne peut pas se connecter au pont, ni à l'hôte, et encore moins le réseau externe, ce doit donc être la question du pont réseau. 🎜

问题解决

  这里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
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

  修改docker默认网桥:

vim /etc/docker/daemon.json

  添加字段:

"bridge":"br0"

  重启docker

service docker start

  此时查看网桥:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

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

docker run -itd --name busy_test busybox

  查看Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

  此时容器挂载在网桥上了,再次查看网桥id
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

  说明已经其作用,进入测试容器内部,Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?:
Que dois-je faire si Docker ne peut pas envoyer une requête ping à lhôte ?

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

问题补充:

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

推荐学习:《docker视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn