Heim >Betrieb und Instandhaltung >Docker >So lösen Sie das Problem, dass Docker nicht auf den Host im Inneren zugreifen kann
Wenn die Firewall aktiviert ist, kann nicht auf den Host-Dienst im Docker-Container zugegriffen werden (Dienste, die auf andere LAN-Computer als den Host zugreifen können:
1. 配置防火墙规则firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重载防火墙规则firewall-cmd --reload 2. 启动容器时使用--net host模式 3. 关闭防火墙_Supplement: Da die im Container angeforderte Quelladresse die interne Netzwerkadresse des verwendeten Docker0-Netzwerksegments ist, kann die Host-Firewall die Anforderung für die interne Netzwerkadresse des Docker0-Netzwerksegments, das nicht das Host-Netzwerk ist, nicht identifizieren Segment und markiert es. Die Quelle ist unbekannt, daher wird die Anfrage abgefangen, indem es Firewall-Quellregeln hinzufügt (das Standard-Intranet-Segment des Docker-Containers ist 172.17.0.0/16):
<rule family="ipv4"> <source address="172.17.0.0/16" /> <accept /></rule>oder Das direkte Ändern der Firewall-Offen-Port-Regeln besteht natürlich darin, den ersten Punkt der Lösung zu lösen, insbesondere wenn die Anzahl der Dienste besonders groß ist und sich die Ports schnell ändern. Es wird empfohlen, den zweiten oder dritten Punkt zu verwenden und gleichzeitig die Sicherheit des Servers zu gewährleisten.Dies ist auch eine häufige Gefahr bei der Bereitstellung von Docker-Containern für Microservices. Wenn Dienste A und B zugreifen Wenn sich die Dienste gleichzeitig auf demselben Host befinden, kann nicht auf sie zugegriffen werden. Wenn sich die Dienste auf verschiedenen Hosts befinden, ist der Zugriff normal. Der Fall ist wie folgt:
同一宿主机微服务之间通信异常的血案: 微服务A能够正常请求AR 微服务B能够正常请求BR 但是微服务A某请求OR,内部访问BR,始终无法调用成功 原因: centos的firewalld为开启状态时,微服务A内部发起请求时,请求无法从容器发出,即出现了调用不成功的情况(No route to host) 矛盾点: spring cloud config 启动缓慢导致在测试的时候config服务启动后的一段时间内无法访问,让我们误以为关闭firewalld后无法接收请求,但又和其他服务又能正常访问出现了矛盾 验证: docker创建四个nginx(8120、8787、8083、8084)容器,并创建ubuntu容器安装curl。 开启iptables,关闭firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均成功 开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均不成功 开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,宿主机配置firewall-cmd --zone=public --add-port=8120/tcp --permanent,进入ubuntu容器使用curl访问,8120访问,其他均不成功 宿主机配置端口使用iptables转发规则配置无效: iptables -A INPUT -p tcp --dport 8120 -j ACCEPT iptables -A OUTPUT -p tcp --dport 8120 -j ACCEPT iptables -A FORWARD -p tcp --dport 8120 -j ACCEPT 结论: 无论firewalld开启还是关闭,均不影响外部访问,宿主机需配置firewall-cmd --zone=public --add-port=8120/tcp --permanent(删除端口去掉--zone=public)同一宿主机才能相互访问成功 生产解决方案: 开启iptables,关闭firewalld 开启iptables,开启firewalld并配置开放端口 (开启或关闭firewalld后,需要重启docker) iptables->ufw(ubuntu)iptables->firewalld(centos)Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem, dass Docker nicht auf den Host im Inneren zugreifen kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!