Docker的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接 口,即容器彼此之间是逻辑隔离的
Docker容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势就是转发效率极高。这是因为Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交换
Docker的网络很好地利用了Linux虚拟网络技术,在宿主机的物理网卡的容器分别创建一个虚拟接口(vthe),并让它们通过宿主机的docker网桥进行连接,如图所示,我们把样的一对veth叫作veth pair。
(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
(3)把原来的yum源缓存进行清除和安装下载好的yum源
[root@aab565576237 yum.repos.d]# yum clean all
[root@aab565576237 yum.repos.d]# yum makecache
(4)为了查看容器的网络信息,在容器内安装“net-tools”网络工具
[root@aab565576237 yum.repos.d]# yum -y install net-tools
(5)在容器内执行以下命令查看容器网络信息
[root@aab565576237 yum.repos.d]# ifconfig
(6)在宿主机上打开一个命令行窗口,执行一下命令查看宿主机的docker0网桥的信息
通过对比两张图可以发现,容器内的网络地址与宿主机的网络地址具有相同的flag。
即
flags=4163
Docker默认采用的bridge网络通信模式
下面用文字描述了这过程
(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”来连接到其他的容 器和计问外部的网络了
docker network 命令用于查看Docker的网络配置信息,下面展示了该命令的帮助信息
下面通过例子来说明这些命令的使用方式
(1)查看Docker的网络通信模式
[root@node1 ~]# docker network ls
(2)查看bridge模式的详细信息
[root@node1 ~]# docker network inspect 525f990e9496