>  기사  >  운영 및 유지보수  >  docker가 내부 호스트에 접근할 수 없는 문제를 해결하는 방법

docker가 내부 호스트에 접근할 수 없는 문제를 해결하는 방법

WJ
WJ원래의
2020-06-09 16:30:274281검색

docker가 내부 호스트에 접근할 수 없는 문제를 해결하는 방법

방화벽이 켜져 있으면 Docker 컨테이너 내부에서 호스트 서비스에 액세스할 수 없습니다(호스트가 아닌 다른 LAN 컴퓨터에 액세스할 수 있는 서비스). 해결 방법:

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

_Supplement: 소스 주소로 인해 request in the 컨테이너 사용된 docker0 네트워크 세그먼트의 내부 네트워크 주소입니다. 호스트 방화벽은 비호스트 네트워크 세그먼트에서 오는 docker0 네트워크 세그먼트의 내부 네트워크 주소에 대한 요청을 식별할 수 없으며 이를 알 수 없음으로 표시합니다. 방화벽 소스 규칙을 추가할 수 있습니다(Docker 컨테이너의 기본 인트라넷 세그먼트는 172.17.0.0/16입니다).

<rule family="ipv4">
<source address="172.17.0.0/16" />
<accept /></rule>

이를 해결하거나 방화벽 개방형 포트 규칙을 직접 변경합니다. 물론, 특히 특별한 경우에는 편의성을 높이기 위해 솔루션의 첫 번째 포인트입니다. 서비스 수가 특히 많고 포트가 빠르게 변경되는 경우 유지 관리 비용을 줄이기 위해 두 번째 또는 세 번째 솔루션을 사용하는 것이 좋습니다. 서버 보안

이는 마이크로서비스용 도커 컨테이너를 배포할 때도 자주 발생합니다. 함정은 서비스 A가 서비스 B에 액세스한다는 것입니다. 서비스 A와 B가 동시에 동일한 호스트에 있으면 액세스할 수 없습니다. 서비스 A와 B는 서로 다른 호스트에 있으며 액세스는 정상입니다. 사례는 다음과 같습니다:

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

관련 권장 사항: docker tutorial

위 내용은 docker가 내부 호스트에 접근할 수 없는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.