目录
一、理论讲解和基础操作
1.Docker容器网络通信的基本原理
docker容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势是转发效率极高。这是因为Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交换。
2.查看Docker容器网络。
(1)基于Centos的镜像创建一个容器,并进入该容器内。
[root@localhost ~]# docker exec -it f8e6cdeade50 /bin/bash 进入Centos8容器
[root@f8e6cdeade50 /]# cd /etc/yum.repos.d/ 切换目录
[root@f8e6cdeade50 yum.repos.d]# rm -rf * 删除该目录的所有东西
[root@f8e6cdeade50 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@f8e6cdeade50 yum.repos.d]# yum -y install net-tools
(3)在宿主机上打开一个命令行窗口,查看宿主机的docker0网桥的信息。
(4)查看容器网络信息。
[root@f8e6cdeade50 ~]# ifconfig
3.使用命令查看Docker的网络配置信息。
(1)利用以下命令查看Docker的网络通信模式。
[root@localhost ~]# docker network ls
- 通过输出信息可以看到,Docker有3种网络通信模式:bridge、host、none。在模式情况下是bridge模式。
- 除这里列出的3种网络通信模式外,Docker还提供了container网络通信模式用于容器间的相互通信。
(2)查看bridge模式的详细信息,ef6f834895a5是bridge模式的ID号。
[root@localhost ~]# docker network inspect ef6f834895a5
- bridge模式的子网地址是“172.17.0.0/16”。是这个网络的容器,那这个容器就是bridge模式
4.Docker的4种网络通信模式。
Docker一共提供了4种网络通信模式:bridge、container、host、none。以下表对比了这4种模式的特点。
网络通信模式 | 是否支持多台主机 | 纵向通信机制 | 横向通信机制 |
bridge | 否 | 绑定宿主机端口 | 通过Linux桥接进行通信 |
container | 否 | 绑定宿主机端口 | 通过Linux连接进行通信 |
host | 是 | 通过宿主机网络进行通信 | 通过宿主机网络进行通信 |
none | 否 | 无法通信 | 只能通过Linux连接进行通信 |
二、操作
1.bridge模式。
(1)使用bridge模式创建容器,使用busybox的镜像创建容器。
[root@localhost ~]# docker run -it --network=bridge busybox /bin/sh
/ #
/ # ifconfig 查看容器的网络信息
2.用户自定义bridge网络。
(1)执行以下命令自定义bridge网络。
[root@localhost ~]# docker network create -d bridge --ip-range=192.168.1.0/24 \
> --gateway=192.168.1.1 --subnet=192.168.1.0/24 bridge2
其中的参数说明如下:
- -d:指定网络通信模式,模式是bridge。
- -ip-range:指定子网IP地址的范围。
- -gateway:指定网关的IP地址。
- --subuet:指定子网的IP地址。
- bridge2:指定bridge网络的名称。
(2)查看Docker的网络,可以看到新创建的bridge2。
[root@localhost ~]# docker network ls
(3)使用 bridge2创建一个容器,这里通过参数--p 指定了容器的IP地址。
[root@localhost ~]# docker run -it --network=bridge2 --ip=192.168.1.3 busybox
/ # ifconfig
3.host模式。
(1)使用host模式来创建容器。
[root@localhost ~]# docker run -it --network=host busybox /bin/sh
/ #
/ # ifconfig
- 对比一下容器内的网络信息和宿主机的网络信息,可以发现,容器与宿主机共享了同一个网络命名空间,即容器使用了宿主机的网络配置信息。
4.container模式。
(1)使用busybox的镜像创建一个容器A,并查看容器的网络信息。
[root@localhost ~]# docker run -it busybox /bin/sh
/ #
/ # ifconfig
(2)开启一个新的命令行窗口,并使用container模式创建一个新的容器 B。
[root@localhost ~]# docker ps -a 查看容器A的ID
[root@localhost ~]# docker run -it --network=container:9ebd8194d2f8 busybox /bin/sh
/ #
/ # ifconfig
(3)查看容器B的网络信息。
-
容器A和容器B使用了相同的网络命名空间这是因为在创建容器B时使用了container模式,使得容器B不再创建自己的网络命名空间,而直接使用容器A的网络命名空间。
5.none模式。
(1)使用none模式来创建一个容器。
[root@localhost ~]# docker run -it --network=none busybox /bin/sh
/ #
/ # ifconfig
- 由于none模式不包含任何网络配置,所以在其网络配置信息中就只包含一个127.0.0.1的IP地址。