Maison > Article > Opération et maintenance > Que dois-je faire si Docker ne peut pas envoyer une requête ping à l'hôte ?
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.
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
Docker
Le 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
查看网络:
网路配置成功,进入容器内部,查看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
service docker stop Commandez
docker network inspect bridge
pour afficher le réseau : ip
a été attribué, mais ping
échoue sur le réseau externe et ne peut pas se connecter au réseau externe réseau : 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 :daemon.json
🎜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. sysctl.conf
🎜docker
Le 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. 🎜yum install bridge-utils
pour installer l'outil, utilisez brctl show
Voir le pont réseau et vous pouvez trouver :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
生成新的网桥不行,说明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
查看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 ?:
成功!
补充:这里使用docker network
新建网桥,没有用,发现新建网桥挂载容器后,其bridge id
依旧不变,没有起作用,说明堡垒机上的docker network
可能存在问题。
上面的问题是创建自定义网桥,然后在自定义网桥上连接容器a
和b
,结果宿主机无法ping
通a
、b
,且进入容器内部后,两个容器无法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!