现象

Docker 容器启动时会去连接 MariaDB (常见的SpringBoot项目,也就是我自己打包的 Docker 镜像,见前文),但是启动失败,提示:

java.net.NoRouteToHostException: Host is unreachable (Host unreachable)

原因

默认情况下,我们 Docker 容器运行时使用的是 Bridge 模式, Docker 启动时会创建名为 docker0 的虚拟网桥,我们 Docker 容器所访问网络均从这个出口出去,所以我们在配置文件中访问宿主机的服务,不再是访问 127.0.0.1 ,而是 docker0 网桥的ip地址,一般来说都是 172.17.0.1 。 但是,Centos 使用的 firewalld 的防火墙,docker容器启动时会配置 iptables 用于自动放行来自容器内部的请求。但是偏偏 firewalld 没有,所以就是这么个原因导致 Docker 容器无法访问宿主机的服务。

解决

知道了原因之后,解决方法自然就出来了。

关闭防火墙

直接简单粗暴的执行:

systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 关闭防火墙的自动启动

放行端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent # 放行端口
firewall-cmd --reload # 重新加载防火墙配置

参考链接

docker容器无法访问宿主机-No route to host