1.Docker网络
1.1 Docker网络模型概述
Docker是一种容器化平台,它提供了一种轻量级的虚拟化解决方案,使得应用程序能够以容器的形式运行。在Docker中,每个容器都有自己的网络栈,可以与其他容器或主机进行通信。Docker网络模型为容器提供了灵活的网络配置和连接选项。
Docker网络模型基于Linux内核的网络命名空间和虚拟以太网桥技术。每个Docker容器都有自己的网络命名空间,这意味着每个容器都有自己的网络接口、IP地址和路由表。Docker还提供了一些网络驱动程序,用于实现容器之间的通信和与外部网络的连接。
Docker网络模型是一个三层的网络模型,它允许容器之间的通信,并提供了多种网络驱动程序供用户选择。Docker网络模型的核心组件包括:
Docker网络:Docker网络是一组容器的虚拟网络,它允许容器之间进行通信。每个Docker网络都有自己的IP地址范围和子网掩码。
Docker网桥:Docker网桥是一个虚拟交换机,它连接了Docker网络和物理网络,并负责容器之间的通信。
容器网络接口(CNI):CNI是一个插件接口,用于配置容器的网络。它定义了一组标准接口和一套配置规范,使得不同的网络驱动程序可以无缝切换。
1.2 Docker网络驱动程序
Docker提供了多种网络驱动程序,用于实现不同的网络连接方式。以下是一些常用的网络驱动程序:
1.2.1 host模式
host驱动程序将容器与主机网络共享,容器将直接使用主机的网络栈和IP地址。这意味着容器可以通过主机的IP地址与外部网络进行通信,但容器之间无法直接通信。使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
使用host驱动程序创建一个容器网络,只需运行以下命令:
$ docker run --name mycontainer --network host nginx
1.2.2 bridge模式
bridge驱动程序是Docker默认的网络驱动程序。它基于Linux内核的bridge技术,创建一个虚拟的以太网桥,用于连接容器和主机网络。每个容器都会分配一个独立的IP地址,并通过桥接方式与其他容器通信。bridge模式是docker的默认网络模式,不写--net
参数,就是bridge模式。
当Docker
进程启动时,会在主机上创建一个名为docker0
的虚拟网桥,此主机上启动的Docke
r容器都会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0
子网中分配一个IP
给容器使用,并设置docker0
的IP
地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair
设备,Docker
将veth pair
设备的一端放在新创建的容器中,并命名为eth0
(容器的网卡),另一端放在主机中,以vethxxx
这样类似的名字命名,并将这个网络设备加入到docker0
网桥中。如下图:
从上图中我们可以看到,可以看到容器内部和Linux主机都会创建一个新的网卡,而这两个网卡都是成对的。使用的技术就是evth-pair。evth-pair 就是一对的虚拟设备接口,他们是成对出现的,一段连着协议,一段彼此相连。evth-pair充当一个桥梁,连接各种虚拟网络设备。
Docker容器完成bridge网络配置的过程如下:
1. 在主机上创建一对虚拟网卡veth pair
设备。veth
设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth
设备常用来连接两个网络设备。
2. Docker
将veth pair
设备的一端放在新创建的容器中,并命名为eth0
。另一端放在主机中,以veth
这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
3. 从docker0
子网中分配一个IP给容器使用,并设置docker0
的IP
地址为容器的默认网关。一般在docker
中docker0
的IP
地址就相当于localhost
。
使用bridge驱动程序创建一个容器网络非常简单,只需运行以下命令:
$ docker run --name mycontainer --network bridge nginx
1.2.3 container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace (网络命名空间),而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
1.2.4 none模式
使用none模式,Docker 容器拥有自己的Network Namespace ,但是,并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
1.3 Docker网络命令示例
1.3.1 创建一个自定义网络
$ docker network create mynetwork
1.3.2 列出所有网络
$ docker network ls
1.3.3 连接容器到网络
$ docker network connect mynetwork mycontainer
1.3.4 断开容器与网络的连接
$ docker network disconnect mynetwork mycontainer
1.3.5 查看容器的网络信息
$ docker network inspect mynetwork
至此本篇文章结束。