Maison > Opération et maintenance > Docker > le corps du texte

Comment résoudre le problème de l'impossibilité d'accéder à l'hôte dans Docker

WJ
Libérer: 2020-06-09 16:30:27
original
4352 Les gens l'ont consulté

Comment résoudre le problème de l'impossibilité d'accéder à l'hôte dans Docker

Lorsque le pare-feu est activé, le service hôte n'est pas accessible à l'intérieur du conteneur Docker (services qui peuvent accéder à d'autres ordinateurs LAN autres que l'hôte Solution :

1. 配置防火墙规则firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重载防火墙规则firewall-cmd --reload
2. 启动容器时使用--net host模式
3. 关闭防火墙
Copier après la connexion

_Supplement : L'adresse source demandée dans le conteneur étant l'adresse réseau interne du segment réseau docker0 utilisé, le pare-feu hôte ne peut pas identifier la demande d'adresse réseau interne du segment réseau docker0 qui n'est pas le réseau hôte segment et le marque. La source est inconnue, donc la requête est interceptée. Elle peut être résolue en ajoutant des règles de source de pare-feu (le segment intranet par défaut du conteneur Docker est 172.17.0.0/16) :

<rule family="ipv4">
<source address="172.17.0.0/16" />
<accept /></rule>
Copier après la connexion

ou changer directement les règles de port ouvert du pare-feu, c'est à dire résoudre le premier point de la solution, bien sûr, par souci de commodité, surtout lorsque le nombre de services est particulièrement important et que les ports changent rapidement, afin de réduire les coûts de maintenance, il est recommandé d'utiliser le deuxième ou le troisième point tout en assurant la sécurité du serveur. Solution

C'est également un piège courant lors du déploiement de conteneurs Docker pour les microservices. Le service A accède au service B. Lorsque les services A et B sont. situés sur le même hôte en même temps, ils ne sont pas accessibles. Lorsque les services sont situés sur des hôtes différents, l'accès est normal. Le cas est le suivant :

同一宿主机微服务之间通信异常的血案:
微服务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)
Copier après la connexion

Recommandations associées :

tutoriel 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal