No route to host两个docker容器的服务访问不通的解决

 更新时间:2025年02月21日 10:44:04   作者:十九岁少年想长肌肉  
在CentOS服务器上使用Docker容器时,当容器之间的服务调用出现“Failed to establish a new connection: [Errno 113] No route to host”错误,是因为容器的报文源地址被防火墙拦截,解决方法有两种:在防火墙上开放指定端口或关闭防火墙

问题描述

如图,我的两个docker服务service1service2位于同一台服务器上,当service1调用service2时,报错:

Failed to establish a new connection: [Errno 113] No route to host'

原因分析

  • 我是在centos服务器上创建的docker容器,其网络模式采用的是bridger模式。
  • 启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
  • 如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。
  • 而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
  • 因此,当docker容器访问宿主机时,宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
  • 而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此不会被目的机器防火墙拦截,所以可以访问。

解决办法

解决办法有两种:

  1. 在防火墙上开放指定端口(推荐),本文中的示例端口号为8033
firewall-cmd --zone=public --add-port=8033/tcp --permanent
firewall-cmd --reload
  1. 关闭防火墙
systemctl stop firewalld

总结

  • 我在服务器A上部署的服务调用其他服务器上的服务,比如服务器B的service3服务,是没有问题的,报文的源地址会转换为宿主机的地址;
  • 但是如果我访问宿主机的服务,即服务器A上其他容器的服务,报文的源地址是docker0网段的地址,宿主机服务端口会被防火墙拦截,从而出现No route to host的错误,需要在防火墙上开放指定端口来解决。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker安装pypiserver私服的方法步骤

    Docker安装pypiserver私服的方法步骤

    本文主要介绍了Docker安装pypiserver私服的方法步骤,通过Docker安装,可以方便地创建私有包仓库,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Docker部署mysql一主一从的操作方法

    Docker部署mysql一主一从的操作方法

    这篇文章主要介绍了Docker部署mysql一主一从,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Linux系统Docker 部署 ASP.NET Core应用的流程分析

    Linux系统Docker 部署 ASP.NET Core应用的流程分析

    这篇文章主要介绍了Linux系统Docker 部署 ASP.NET Core应用的流程分析,在操作过程中小编遇到很多问题,下面把我的经验及处理方法分享到脚本之家平台,需要的朋友参考下吧
    2021-06-06
  • 详解使用 Docker 构建 LNMP 环境

    详解使用 Docker 构建 LNMP 环境

    本篇文章主要介绍了使用 Docker 构建 LNMP 环境,详细的介绍了配置LNMP 环境的步骤。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 谈谈我对docker的理解

    谈谈我对docker的理解

    作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。这篇文章给大家介绍了docker的优势及docker的三个基本概念,感兴趣的朋友一起看看吧
    2016-10-10
  • Docker容器日志清理的几种方法

    Docker容器日志清理的几种方法

    已经经历两次开发环境磁盘占用满的情况的,第一次是部署太频繁,然后有很多无用的images没有删除掉,第二次是docker容器,某些服务写了很多日志,导致磁盘被写满,那么怎么清理掉一些“垃圾”,让docker占用空间变得小一点?本文给大家整理了几种清理日志的方法
    2025-07-07
  • Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

    Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

    本文详细介绍了如何从GitLab 17.1.2版本升级到17.6.1版本,包括备份数据、确定升级路线、分步骤升级以及最终验证新版本的步骤,需要的朋友可以参考下
    2025-02-02
  • Docker可视化管理工具DockerUI的使用

    Docker可视化管理工具DockerUI的使用

    这篇文章主要介绍了Docker可视化管理工具DockerUI的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • docker打包golang应用的过程分析

    docker打包golang应用的过程分析

    这篇文章主要介绍了docker打包golang应用的过程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Docker基本命令使用详解(推荐)

    Docker基本命令使用详解(推荐)

    因为工作中需要将服务容器化,所以最近开始学习Docker相关的知识,对于Docker入门常用的命令总结下分享到脚本之家平台,需要的的朋友参考下
    2017-03-03

最新评论