网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的

        Docker的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接 口,即容器彼此之间是逻辑隔离的

1.Docker容器网络通信的基本原理

        Docker容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势就是转发效率极高。这是因为Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交换

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第1张图片

        Docker的网络很好地利用了Linux虚拟网络技术,在宿主机的物理网卡的容器分别创建一个虚拟接口(vthe),并让它们通过宿主机的docker网桥进行连接,如图所示,我们把样的一对veth叫作veth pair。

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第2张图片

查看Docker容器网络

(1)基于centos的镜像创建一个容器,并进入该容器内

[root@node1 ~]# docker run -it centos /bin/bash
[root@aab565576237 /]# cd /etc/yum.repos.d/
[root@aab565576237 yum.repos.d]# ls
CentOS-Linux-AppStream.repo	     CentOS-Linux-Debuginfo.repo  CentOS-Linux
CentOS-Linux-BaseOS.repo	     CentOS-Linux-Devel.repo	  CentOS-Linux
CentOS-Linux-ContinuousRelease.repo  CentOS-Linux-Extras.repo	  CentOS-Linux
[root@aab565576237 yum.repos.d]# mv *.repo /opt/        //把原有的这些yum源移动到opt目录中
               

(2)在容器内下载新的yum源

[root@aab565576237 yum.repos.d]# curl -O https://mirrors.aliyun.com/repo/Centos-8.repo

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第3张图片

(3)把原来的yum源缓存进行清除和安装下载好的yum源

[root@aab565576237 yum.repos.d]# yum clean all
[root@aab565576237 yum.repos.d]# yum makecache

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第4张图片

(4)为了查看容器的网络信息,在容器内安装“net-tools”网络工具

[root@aab565576237 yum.repos.d]# yum -y install net-tools

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第5张图片

(5)在容器内执行以下命令查看容器网络信息

[root@aab565576237 yum.repos.d]# ifconfig

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第6张图片

(6)在宿主机上打开一个命令行窗口,执行一下命令查看宿主机的docker0网桥的信息

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第7张图片

通过对比两张图可以发现,容器内的网络地址与宿主机的网络地址具有相同的flag。

flags=4163mtu 1500这说明了在创建容器时,会成对的创建veth pair,并且它们通过宿主机的docker0网桥进行通信

宿主机与Docker容器建立网络通信的过程

        Docker默认采用的bridge网络通信模式

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第8张图片

下面用文字描述了这过程

(1)客户端执行“docker run”命令创建并启动容器

(2)Docker引擎创建一对虚拟接口 veth pair; 并把它们分别放到宿主机和新容器的网 络命空间中

(3)Docker 引擎将宿主机上的 veth 接口连接到宿主机的 docker0 网桥上,并且给 它分配-个以“veth”开头的名字,如 vetha66e425

(4)Docker引擎将容器上的veth 接口改名为“eth0”,并且该接口只有在容器内网 络命名空间中是可见的

(5)Docker引擎从宿主机的 docker0 网桥上分配一个空闲的IP地址给容器内的eth0 例如172.17.0.2。并将容器内eth0的路由网关设置为docker0的内部P地址,例 如:172.17.0.1

完成以上的这些步骤后,容器就可以使用其内部的虚拟接口“eth0”来连接到其他的容 器和计问外部的网络了

2.使用命令查看Docker的网络配置信息

docker network 命令用于查看Docker的网络配置信息,下面展示了该命令的帮助信息

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第9张图片

下面通过例子来说明这些命令的使用方式

(1)查看Docker的网络通信模式

[root@node1 ~]# docker network ls

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第10张图片

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第11张图片

(2)查看bridge模式的详细信息

[root@node1 ~]# docker network inspect 525f990e9496

网络通信大揭秘:Docker内部究竟是如何进行虚拟交流的_第12张图片

你可能感兴趣的:(Docker,docker,容器)