Docker的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接 口,即容器彼此之间是逻辑隔离的。
那么,如何实现容器的相互通信呢?容器又如何访问外部的网络呢?外部的网络如何才能 访问部署在容器内的应用呢?本章将带领读者详细了解这些问题。
4.1 Docker容器网络通信的基本原理
Docker容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势是转发效率极高。
这是因为Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓
存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交
换。
注释:虚拟接口和一个正常的以太网并无太大区别,只是它的速度比以太网卡快得多。
Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别
创建-个虚拟接口(veth),并让它们通过宿主机的 docker 网桥进行连接,如图4-1 所示。我
们把样的一对veth叫作veth pair。
[root@mm ~]# curl -O https://mirrors.aliyun.com/repo/Centos-8.repo
[root@mm ~]# yum clean all
[root@mm ~]# yum makecache
(1)基于Centos的镜像创建一个容器,并进入该容器内。
[root@mm ~]# docker run -it centos /bin/bash
[root@44f918b62b96 /]# cd /etc/yum.repos.d/
[root@44f918b62b96 yum.repos.d]# rm -rf *
[root@44f918b62b96 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Linux-Baseali.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
(2)为了查看容器的网络信息,在容器内安装“net-tools”网络工具。
[root@44f918b62b96 yum.repos.d]# yum -y install net-tool
(3)在宿主机上打开一个命令行窗口,执行以下命令查看宿主机的 docker0网桥 的信息
![](https://img-blog.csdnimg.cn/634683ee533a4a54b402d251ffc87275.png)
(4)在容器内执行以下命令查看容器网络信息
2 宿主机与Docker容器建立网络通信的过程
Docker默认采用的是bridge 网络通信模式。图4-4 说明了在创建Docker 容器时建立
网络通信的过程。
下面用文字描述了这过程。
(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”来连接到其他的容
器和计问外部的网络了。
4.2使用命令查看 Docker的网络配置信息
docker network”命令用于查看Docker的网络配置信息。
![](https://img-blog.csdnimg.cn/f3273a5d1f03412ca107fd2a47ce6854.png)
下面通过例子来说明这些命令的使用方式。
(1)利用以下命令查看Docker的网络通信模式
(2)查看bridge模式的详细信息
![](https://img-blog.csdnimg.cn/b2053a525329402ea36afcd05a79912d.png)