Docker的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接
口,即容器彼此之间是逻辑隔离的。
那么,如何实现容器的相互通信呢?容器又如何访问外部的网络呢?外部的网络如何才能
访问部署在容器内的应用呢?
1.Docker容器网络通信的基本原理
Docker容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势是转发效率极高。
这是因为Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓
存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交
换.
![](https://img-blog.csdnimg.cn/8dc8c3225874433fb66ab5e16a4d08be.png)
Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别
创建-个虚拟接口(veth),并让它们通过宿主机的 docker 网桥进行连接,如图。我
们把样的一对veth叫作veth pair
![](https://img-blog.csdnimg.cn/bb95f8c42540428794b7fa461b314cfe.png)
1.查看Docker容器网络
1)基于Centos的镜像创建一个容器,并进入该容器内。
[root@node01 ~]# docker run -it dokken/centos-8 /bin/bash //运行并进入容器内部
[root@262c6d461971 /]# cd /etc/yum.repos.d/ //切换到yum源仓库
[root@262c6d461971 yum.repos.d]# rm -rf * //删除所有yum源
[root@262c6d461971 yum.repos.d]# ls //查看你是否删除
[root@262c6d461971 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Linux-Baseali.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo //在阿里云拉取yum源
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 2495 100 2495 0 0 13633 0 --:--:-- --:--:-- --:--:-- 13633
[root@262c6d461971 yum.repos.d]# ls //查看是否拉取成功
CentOS-Linux-Baseali.repo //yum源
2)为了查看容器的网络信息,在容器内安装 “net-tools” 网络工具
[root@71794aa7cc2a /]# yum -y install net-tools
3)在宿主机上打开一个命令行窗口,执行以下命令查看宿主机的docker0网桥
![](https://img-blog.csdnimg.cn/c8081a25bf044eb683bdf352470ced0b.png)
4)在容器内执行以下命令查看容器网络信息
[root@71794aa7cc2a /]# ifconfig
对比 第三步图和第四步图可以发现,容器内的网路地址与宿主机的网络地址具有相同的flags即
flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 。这说明了在创建容器时,会成对的创建 veth pair,并且他们通过宿主机的docker0网桥镜像通信
2.宿主机与Docker容器建立网络通信过程
Docker默认采用的是bridge 网络通信模式,如图,说明了在创建Docker容器时建立网络通信的过程。
![](https://img-blog.csdnimg.cn/4c45647fe84f4cbda551b5da22f5b595.png)
文字描述过程
- 客户端执行 “docker run” 命令创建并启动容器。
- Docker引擎创建一对虚拟接口 veth pair,并把它们分别放到宿主机和新容器的网络命名空间中。
- Docker引擎讲宿主机上的 veth 接口连接到宿主机的docker0 网桥上,并且给它分配一个 “veth” 开头的命令,如 veth66e425
- Docker引擎容器上的veth 接口改名为eth0 ,并在该接口只有容器内网络命名空间中式可见的
- Dockers引擎从宿主机的docker0网桥上分配一个空闲的ip地址给容器内的eth0
例如172.17.0.2。并将容器内eth0的路由网关设置为docker0的内部P地址,例如:172.17.0.1。
完成以上的这些步骤后,容器就可以使用其内部的虚拟接口“eth0”来连接到其他的容
器和计问外部的网络了。
3.使用命令查看Docker的网络配置信息
docker network”命令用于查看Docker的网络配置信息。如图展示了该命令的帮助信息
![](https://img-blog.csdnimg.cn/fa6d4ae0bd714882a1be7b28f4aede58.png)
下面通过例子来说明这些命令的使用方式
1)利用以下命令查看Docker的网络通信模式
[root@node01 ~]# docker network ls
![](https://img-blog.csdnimg.cn/2d7b860289ac4d7592e0e4572314cd0d.png)
![](https://img-blog.csdnimg.cn/8bb13bf638a14bb3880a0364036d59d4.png)
2)查看bridge模式的详细信息输入以下命令,如图所示
[root@node01 ~]# docker network inspect 545585585ff2 //网络的ID号这里查看的是bridge的详细信息
从上图可以看出,bridge模式默认的子网地址是 “172.17.0.0/16” 对比第四步 4)图 可以发现,容器的IP地址是“172.17.0.3” 属于bridge网络的子网地址。
111