容器外访问容器应用详解

1.前言

这几天突然对容器外是如何访问容器内的应用产生了兴趣,然后看网上讲的不是很细节,就自己弄了一下,顺便写成文章,以后自己忘记了也能够看一下。

2.前置知识

这里有几个前置知识,希望大家能有所了解:
(1)四表五链,最主要的一图已经给大家搬过来了(鸟哥那里偷的),具体的自行查阅资料哦;
在这里插入图片描述

图一

(2)docker容器网络默认使用桥接方式;

3. 环境

3.1 实验环境

在这里插入图片描述

图二

Notes:
(1) 本次实验使用机器B去访问机器A中的mysql容器;
(2) IP信息和MAC地址都已经列出来了;
(3) mysql容器指映射端口3306。

3.2 机器A的路由表、iptables规则、网桥

在这里插入图片描述

图三

在这里插入图片描述

图四

在这里插入图片描述

图五

4.数据包流向

(1) 从机器B访问机器A中的mysql数据库,从B机器发出去的数据包是这样的(看不到上面的图五可以重新打开一个网页一起看哦):
数据包机器B:eth0->机器A:eth0:
src ip: 172.20.187.197
src mac: 52:54:00:5d:c8:31
dest ip: 172.20.187.201
dest mac: 52:54:00:c3:d7:2a

(2) 机器A收到数据包,mac地址是本地eth0的地址,放行,数据包向上给IP层;
(3) nat表PREROUTING链: 判断目标地址是本地地址(172.20.187.201),转给DOCKER;
(4) nat表DOCKER链: 输入接口不是docker0,判断下一条;
(5) nat表DOCKER链: 输入接口不是docker0,是tcp,访问端口是3306,修改目标地址为172.17.0.2:3306,ACCPT;
(6) 路由选择: 目标地址(172.17.0.2:3306)不是本机IP,通过路由进入转发(FORWARD),由路由表可知使用docker0进行转发;
(7) filter表FORWARD链: 转给DOCKER-ISOLATION,DOCKER-ISOLATION直接返回;
(8) filter表FORWARD链: 输出接口是docker0,转到DOCKER链;
(9) filter表DOCKER链:判断目标地址是172.17.0.2/32且输入接口不是docker0,输出接口是docker0,端口是3306,接受;
(10) nat表POSTROUTING链: 源地址不是172.17.0.0/16(源地址是172.20.187.197),下一条;
(11) nat表POSTROUTING链: 源地址不是172.17.0.2/32(源地址是172.20.187.197),下一条,默认ACCEPT;
(12) 包的源mac地址填入docker0的mac地址,进入MAC层,此时docker0网桥判断目标MAC地址与172.17.0.2的MAC地址相同,则将包转发给vethb79ad42@if44,也就是转发给mysql容器;
(13) docker0 -> eth0@if45 此时包的地址信息如下:
src ip: 172.20.187.197
src mac: 02:42:5e:f6:6e:4c
dest ip: 172.17.0.2
dest mac: 02:42:ac:11:00:02
(14) 包被容器处理完后返回,发送给容器的网关,docker0(容器内的网关是机器A的网桥):
​ eth0@if45 - > docker0 此时的包地址信息如下:
​ src ip: 172.17.0.2
​ src mac: 02:42:ac:11:00:02
​ dest ip: 172.20.187.197
​ dest mac: 02:42:5e:f6:6e:4c

(15) 机器A的mac层发现mac地址是docker0,进入IP层:
(16) nat表PREROUTING链:判断出目标IP地址不是本地地址,默认ACCEPT;
(17) 路由选择: 目标地址(172.20.187.197)不是本机IP,通过路由进入转发,由路由表可知使用172.20.186.0的eth0进行转发(同一网段);
(18) filter表FORWARD链: 转给DOCKER-ISOLATION,DOCKER-ISOLATION直接返回;
(19) filter表FORWARD链: 输出接口不是docker0,跳过2条规则;
(20) filter表FORWARD链: 输入接口是docker0,输出接口不是docker0,ACCEPT;
(21) nat表POSTROUTING链: 源地址是172.17.0.0/16输出接口不是docker0,-j MASQUEREAD使用eth0的IP作为源IP发送;
​(22) 包的源mac地址填入eth0的mac地址,进入MAC层,发送;
机器A:eth0 -> 机器B:eth0 此时的包地址信息如下:
​ src ip: 172.20.187.201
​ src mac: 52:54:00:c3:d7:2a
​ dest ip: 172.20.187.197
​ dest mac: 52:54:00:5d:c8:31
(23) 机器B的eth0收到消息。

5.问题

(1) 数据包全部转给docker了,是怎么访问本地的?
答: 从图五可以发现,只有当访问端口是3306时,才会将目标地址改写为172.17.0.2。

(2) 对于DOCKER-ISOLATION这条规则链,是docker默认创建的,而对我们上面这个情况完全没啥用,进去直接就返回了,所以可以直接删除的。

6. 总结

写的不好,多多包容。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前面有光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值