发布信息

四 Docker网络揭秘

     2024-10-22 14:03:35     114

本文目录导航:

四、Docker网络揭秘

Docker 之所以性能这么弱小,其实就是充沛应用了Linux Kernel的特性:NameSpace、CGroups、UnionFileSystem。

经过这些特性成功了资源隔离、限度与分层等。

本文这次就来揭晓Docker中的容器是如何做到网络互通的。

两台机器假设要成功通讯,其实就是经过底层的网卡启动数据传输,每个网卡都有一个惟一的MAC地址,网卡又会绑定一个ip地址,只需两台机器的网络可以互通,那么这两台机器就可以启动通讯。

想要成功通讯,就得有两个同一网段的网卡,两个网卡必定是可以 ping 通的。

Docker在装置成功后,会在宿主机创立一个docker0网卡,这个网卡就是担任容器与宿主机之间通讯的桥梁。

经过Docker创立一个容器之后,会在宿主机再创立一个网卡,也就是下面的 veth3543ea3@if7 ,容器内也会创立一个网卡。

普通成对的网卡,网卡组件称号前面的数字是延续的,比如宿主机的 @if7 和容器内的 @if8 ,正是这成对的网卡,才成功了容器与宿主机之间的通讯。

这其实是应用 Linux Kernel 的特性 NameSpace 成功的网卡隔离,不同NameSpace下的网卡是独立的,就像Java程序中的package一样。

从下面的例子中看到容器与宿主机之间的通讯如同并不是经过docker0网卡成功的? 其实这只是单容器的形态,或许看不出docker0的作用。

用图来示意一下单容器的网卡通讯状况。

经过docker生成的 eth0和veth 两个网卡成功同一网段内的通讯,而这个网卡又是桥接在docker0网卡上的。

再看下有多个容器的状况。

两个容器之间可以相互通讯的要素就是由于docker0的存在,由于它们的网卡都是桥接在docker0上,所以也就有了和另一个容器通讯的桥。

咱们来验证一下是不是这样! 这种网络衔接方法咱们称为Bridge,这也是docker中自动的网络形式。
四
可以经过命令检查docker中的网络形式: 经过 docker network ls 命令检查到,docker提供了3种网络形式,brige形式咱们曾经知道了,那 host 和 none 又是什么意思呢?无妨来验证一下: 这种形式只会创立一个本地的环路网卡,不可与其余容器或宿主机启动通讯。

在创立自己的network之前先来解释一下为什么要创立新的network。

咱们用一个例子来展示一下不同容器之间的通讯。

容器之间经过 ip 是可以反常访问的,然而有没有这种状况:假设一个容器出疑问了,咱们重启之后它的ip变了,那是不是其余用到这个容器的名目性能是不是都得改。

有没有或许间接经过容器称号来访问呢?来验证一下: 发现并不能 ping 通,然而可以经常使用别的手腕来到达这个目的。

经过下面这种形式就可以做到以容器名来 ping 通其余容器,其实它就跟windows系统中在 hosts 文件里加了个映射是一样的。

可以看到创立自定义的 network 智能帮咱们成功了这特性能,而且经常使用自定义的 network 也繁难治理,不同业务类型的容器可以指定不同的 network。

不同的 network ip网段也不一样,这样也可以参与单机中可以创立的容器的数量。

在创立一个容器的时刻,普通都须要讲容器须要泄露的端口映射到物理主机的相反端口或其余端口,由于在外网环境下是不繁难间接衔接到容器的,所以须要经过映射端口的形式,让外网访问宿主机的映射端口来访问容器。

假构想建设多个容器,势必需要端口映射,以满足不同容器经常使用相反端口的状况。

以上这些内容都是在单容器启动操作,容器之间通讯也只是经过 docker0 成功的桥接形式。

假设要成功多机之间的docker通讯,其实还是经过网卡,只不过须要其余的技术来成功了。

本章节就不在展示,到前面的章节再来剖析!

Docker 容器如何访问外部网络以及端口映射原理?

Docker容器理论能智能访问外部网络,这是由于其自动经常使用Bridge Network类型的网络,并应用iptables设置的SNAT规定成功。

当创立容器时,Docker会自动性能,未来自172.17.0.0/16网络的数据包源地址交流为主机的IP地址,准许容器访问互联网资源。

启动一个nginx容器并映射端口后,外部和外部网站访问都能反常启动。

经过命令sudo iptables -t nat -nL,可以看到POSTROUTING链中的SNAT规定,这是容器能访问外网的关键。

假设容器内访问外部网络出现疑问,审核ip_forward设置能否开启,或许docker daemon启动参数--ip-forward能否为true。

端口映射的原理重要在DOCKER链上性能DNAT,例如,iptables会将外部发往主机2024端口的数据包重定向到容器的172.17.0.2:80。

DNAT和SNAT区分处置指标地址和源地址的修正,DNAT在PREROUTING和OUTPUT链,而SNAT则在POSTROUTING和INPUT链上操作。

此外,经常使用docker port命令可以检查容器的端口映射,同时了解DNAT和SNAT的基本概念。

DNAT是目的地址转换,不修正协定,只在PREROUTING和OUTPUT链出现;SNAT则是源地址转换,或许触及网络地址伪装,理论在POSTROUTING和INPUT链上口头。

docker网段抵触造成主机网络意外处置

最近,公司主机网络遭逢疑问,体现为某台主机不可访问某个特定网段的机器,Ping恳求不可成功。

疑问源于在启动Docker容器时出现的衔接终止,造成主机不可从新建设衔接。

主机驳回的网段是100.10.x.x,指标机器的IP在172.17.x.x网段。

经过剖析,发现或许是Docker网桥影响了主机的路由表。

实践上,Docker装置后会在主机上创立一个虚构网卡,命名为docker0,用于衔接Docker容器与主机的其余网络组件之外的一切外部通讯。

这个虚构网卡经常使用一个固定的网段,理论是172.17.x.x。

由此,疑问得以明白:Docker0抢占了该网段,造成主机不可访问其余机器。

要处置此疑问,只需修正docker0绑定的网段即可。

处置打算如下:

详细操作步骤和详细文档如下:

参考文档:

本文由 mdnice 多平台颁布

相关内容 查看全部