欢迎来到Heck's Blog,专业承接拿站、企业建站、仿站、网上商城架构、门户网站搭建、空间域名注册、软件定制等项目。关注网络安全,因为专注,所以专业,懂得放弃,才能收获。有事请发邮件至i@heckjj.com,请记住本站网址:http://www.heckjj.com,多谢。
9月5
一. 问题描述
  在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
  然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
  原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?

二. 原因分析
  在进行docker部署的时候我们采用的是bridge网桥的模式。

  启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。

  如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。

  因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。

  而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。

三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld

2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题

四. 小结
  docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]