Docker解决容器内访问宿主机'No route to host'的问题

问题

使用docker在虚拟机上搭建了prometheus服务器,并采集etcdjaeger等服务的监控指标,有一天prometheus的targets中State显示异常,发现是不能访问宿主机IP导致。另外一个容器访问别外一个容器的数据库(也是通过主机IP)也不成功,应该是同一问题。

解决

主要原因在服务器屏蔽从docker内部的访问, 修改服务器的防火墙设置即可.

ifconfig查看docker0的IP,一般为172.17.0.1

在服务器内修改配置文件vi /etc/firewalld/zones/public.xml添加容器A的ip地址, 具体内容如下:

1  <rule family="ipv4">
2    <source address="172.17.0.0/16"/>
3    <accept/>
4  </rule>

也可用命令添加:

1firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.17.0.0/16 accept'

如果以上操作问题还是不能解决,可尝试开启防火墙端口:

1firewall-cmd --zone=public --add-port=3306/tcp --permanent  # mysql
2firewall-cmd --zone=public --add-port=2379/tcp --permanent  # etcd
3firewall-cmd --zone=public --add-port=14269/tcp --permanent # jaeger
4firewall-cmd --reload

这些命令主要是修改vi /etc/firewalld/zones/public.xml文件,操作后的内容如下:

 1<?xml version="1.0" encoding="utf-8"?>
 2<zone>
 3  <short>Public</short>
 4  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
 5  <service name="ssh"/>
 6  <service name="dhcpv6-client"/>
 7  <port protocol="tcp" port="20"/>
 8  <port protocol="tcp" port="21"/>
 9  <port protocol="tcp" port="22"/>
10  <port protocol="tcp" port="80"/>
11  <port protocol="tcp" port="443"/>
12  <port protocol="tcp" port="3306"/>
13  <port protocol="tcp" port="2379"/>
14  <port protocol="tcp" port="14269"/>
15  <rule family="ipv4">
16    <source address="172.17.0.0/16"/>
17    <accept/>
18  </rule>
19</zone>

如果还存在问题的话,重启docker

1systemctl restart docker.service

发布日期:2023-07-31 19:40 字数:136 用时 1分钟
tags:docker