解决同一个宿主机的两个容器无法端口互通报错“No route to host“的问题记录

事情是这样的,在搭建流水线时,我首先部署了一台虚拟机来跑gitlab服务和jenkins服务,两者都以容器的形式来进行运行,并且容器内部的端口都通过映射到宿主机来实现容器间端口的互通。

但是在做着做着,我发现在Jenkins的页面在做项目配置的时候,一直显示拉取不到仓库的代码,一直报错No route to host。

在进入容器内部是可以ping通宿主机的,但是telnet宿主机的222端口却死活不通。

为此,我查询了大量文档,说是docker容器网络要改成主机模式,什么容器内部没有安装git客户端啥的,公钥私钥配置错误之类的,自己反复检查了几遍也发现根本就不是这些问题,问AI也只会重新大改容器,而不解释如何排查出真正的原因。

后来,我向外界寻求技术支持,远程帮助我解决了这个问题。

在他的指导下,大概意思就是,我的服务器在最开始启动容器之前便一直在开启着Firewalld服务,然后在启动docker容器的同时,docker会自动添加对应的iptables的规则。

但是经排查发现对于那几个我要用到的端口的规则,Firewalld是缺少的。

如果要在启动防火墙的情况下启动那些容器,并且Jenkins容器可以访问到gitlab容器的80端口或者是22端口,都需要配置相应的防火墙规则,才会让容器内部也产生相应的iptables规则。因为我把gitlab容器的4433端口映射到了宿主机的4433,22端口映射到了宿主机的222。

所以应该要添加firewalld规则,如下。

fire-cmd --zone=public --add-port=4433/tcp --permanent

fire-cmd --zone=public --add-port=222/tcp --permanent

fire-cmd --zone=public --add-port=7070/tcp --permanent (jenkins的7070被映射到了宿主机的8080)

firewall-cmd --reload

然后再重新启动容器才能实现,容器间的端口互通。

或者直接在关闭firewalld的情况下再启动容器,也不会有容器间不通的情况。

然后基于这种情况我再换了关键词去网上搜索,觉得以下这篇文章似乎就是讲的我这种情况

https://www.jb51.net/server/336273xq7.htm

我理解的大概意思就是:

网络模式为桥接模式下的docker容器在访问宿主机时,数据会以docker0的虚拟网桥的地址发送给宿主机,但是宿主机的firewalld并没有设置允许docker0的网段的流量,所以会被防火墙拦截。从而导致了No route to host的结果。

所以,要解决这个问题,要么先添加好firewalld的规则,再启动docker容器,要么直接关闭firewalld再启动容器,都可以解决这些问题。

相关推荐
Agent产品评测局11 分钟前
图片生成智能体哪家好?2026年企业级视觉创作与自动化选型全景横评
运维·人工智能·ai·自动化
猫头虎-人工智能14 分钟前
ToDesk ToClaw AI自动化实测:零门槛玩转日常自动化,告别折腾与硬件损耗
运维·人工智能·架构·开源·自动化·aigc·ai编程
实在智能RPA15 分钟前
Agent 能做流程的自动化监控吗?——深度拆解2026年AI智能体在企业级闭环监控中的技术实践
运维·人工智能·ai·自动化
翱翔-蓝天25 分钟前
WSL + Docker + GPU 安装 video-subtitle-remover 完整文档
运维·docker·容器
云飞云共享云桌面28 分钟前
研发部门使用SolidWorks和ug,cad,设计共享云桌面应该怎么选?
运维·服务器·网络·人工智能·3d
江湖有缘28 分钟前
PanCheck 容器化部署:自建网盘链接检测服务全流程
docker
Shadow(⊙o⊙)32 分钟前
C语言学习中需要的额外函数
c语言·开发语言·学习
麦聪聊数据33 分钟前
数据库安全与运维管控(五):基于AST的SQL拦截与动态审批
运维·数据库·sql
亚空间仓鼠35 分钟前
OpenEuler系统常用服务(十)
linux·运维·服务器·网络
艾莉丝努力练剑35 分钟前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习