如何解决docker内部访问不了宿主


当前第2页 返回上一页

这也是微服务docker容器化部署时经常会遇到的坑,A服务访问B服务,当A、B服务同时位于一台宿主机时无法访问,当A、B服务位于不同宿主机时,访问正常。案例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

同一宿主机微服务之间通信异常的血案:

微服务A能够正常请求AR

微服务B能够正常请求BR

但是微服务A某请求OR,内部访问BR,始终无法调用成功

原因:

    centos的firewalld为开启状态时,微服务A内部发起请求时,请求无法从容器发出,即出现了调用不成功的情况(No route to host)

矛盾点:

    spring cloud config 启动缓慢导致在测试的时候config服务启动后的一段时间内无法访问,让我们误以为关闭firewalld后无法接收请求,但又和其他服务又能正常访问出现了矛盾

验证:

    docker创建四个nginx(8120、8787、8083、8084)容器,并创建ubuntu容器安装curl。

    开启iptables,关闭firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均成功

    开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均不成功

    开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,宿主机配置firewall-cmd --zone=public --add-port=8120/tcp --permanent,进入ubuntu容器使用curl访问,8120访问,其他均不成功

    宿主机配置端口使用iptables转发规则配置无效:

        iptables -A INPUT -p tcp --dport 8120 -j ACCEPT

        iptables -A OUTPUT -p tcp --dport 8120 -j ACCEPT

        iptables -A FORWARD -p tcp --dport 8120 -j ACCEPT

结论:

    无论firewalld开启还是关闭,均不影响外部访问,宿主机需配置firewall-cmd --zone=public --add-port=8120/tcp --permanent(删除端口去掉--zone=public)同一宿主机才能相互访问成功

生产解决方案:

    开启iptables,关闭firewalld

    开启iptables,开启firewalld并配置开放端口

    (开启或关闭firewalld后,需要重启docker)

iptables->ufw(ubuntu)iptables->firewalld(centos)

相关推荐:docker教程

以上就是如何解决docker内部访问不了宿主的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

linux怎么新建Docker容器

怎么通过tar包解压安装Docker

Docker服务启动报错怎么办

怎样查看linux中Docker镜像文件

如何打包Docker镜像?

怎样删除刚安装好的Docker

Docker安装oracle好吗

Docker 可以用在哪些方面?

Docker如何运行项目

Docker有什么作用

更多相关阅读请进入《Docker》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...