Docker有五种网络模式,它们分别是bridge、host、overlay、ipvlan和macvlan还有None。每种网络模式都有自己的特点和用途,下面分别简单介绍一下。
网络模式
None
Docker 的 None 网络模式是一种特殊的网络模式,它不为容器创建任何网络接口或连接到任何网络。在 None 网络模式下,容器不会有任何网络连接,无法使用网络通信,也无法访问外部网络或其他容器。
该模式通常用于安全性或测试目的,例如在容器中执行敏感操作,而不希望容器与任何其他网络进行通信,或者在测试过程中模拟网络隔离场景。
以下是一些使用 Docker None 网络模式的示例:
# 创建一个使用 None 网络模式的容器
docker run --network=none <IMAGE>
# 进入使用 None 网络模式的容器
docker exec -it <CONTAINER> /bin/bash
# 在使用 None 网络模式的容器中执行敏感操作
需要注意的是,使用 None 网络模式的容器无法通过网络进行通信,包括与宿主机的通信,因此需要在容器中手动安装必要的软件包和工具,以便在容器内进行操作。
bridge
- bridge:这是默认的网络模式,它会在主机和容器之间创建一个软件桥接。连接到这个网络的容器可以互相通信,也可以与外部网络通信,但是它们与其他网络隔离。每个容器都会分配一个自己的IP地址。这种网络模式适合于单机上运行的需要相互通信的容器。一个简单的例子是:
# 创建一个bridge网络
docker network create -d bridge my_bridge
# 启动两个容器并连接到这个网络
docker run -d --name container1 --network my_bridge busybox sleep 3000
docker run -d --name container2 --network my_bridge busybox sleep 3000
# 在container1中ping container2
docker exec -it container1 ping container2
这个例子中,我们创建了一个名为my_bridge的bridge网络,并在这个网络上启动了两个容器container1和container2。然后我们在container1中执行ping命令,可以看到它能够成功地ping通container2,说明它们之间可以通信。
host
- host:这种网络模式会让容器共享主机的网络栈,没有任何隔离。容器不会分配自己的IP地址,而是直接使用主机的IP地址和端口。这种网络模式适合于需要高性能或者不需要隔离的容器。一个简单的例子是:
# 启动一个容器并使用host网络模式
docker run -d --name container3 --network host busybox sleep 3000
# 查看容器的IP地址,发现与主机一致
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container3
这个例子中,我们启动了一个名为container3的容器,并使用了host网络模式。然后我们查看了它的IP地址,发现它与主机的IP地址一样,说明它没有自己的IP地址,而是共享了主机的网络栈。
overlay
- overlay:这种网络模式是分布式的,可以跨越多个Docker主机。这个网络允许在不同主机上运行的容器互相通信,而不需要操作系统级别的路由支持。overlay网络是Docker Swarm集群的网络实现,但是你也可以在两个独立的Docker Engine上使用它来让容器直接联系。这种网络模式适合于需要跨主机通信或者构建集群的容器。一个简单的例子是:
# 在两台主机上安装Docker Engine,并初始化Swarm集群
docker swarm init --advertise-addr <MANAGER-IP>
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
# 在管理节点上创建一个overlay网络
docker network create -d overlay my_overlay
# 在管理节点上启动一个服务,并连接到这个网络
docker service create --name service1 --network my_overlay busybox sleep 3000
# 在工作节点上启动一个容器,并连接到这个网络
docker run -d --name container4 --network my_overlay busybox sleep 3000
# 在服务中ping容器
docker exec -it $(docker ps -q -f name=service1) ping container4
这个例子中,我们在两台主机上安装了Docker Engine,并初始化了一个Swarm集群。然后我们在管理节点上创建了一个名为my_overlay的overlay网络,并在这个网络上启动了一个名为service1的服务。接着我们在工作节点上启动了一个名为container4的容器,并连接到这个网络。最后我们在service1中执行ping命令,可以看到它能够成功地ping通container4,说明它们之间可以跨主机通信。
ipvlan
- ipvlan:这是一种高级的网络模式,它可以让用户完全控制容器的IPv4和IPv6地址,以及层2和层3的VLAN标签和路由。这种驱动适用于需要将容器化服务与现有物理网络集成的场景。ipvlan网络会分配自己的接口,相比bridge网络有性能优势²。一个简单的例子是:
# 创建一个ipvlan网络,并指定父接口和子网
docker network create -d ipvlan \
--subnet=192.168.210.0/24 \
--gateway=192.168.210.1 \
-o parent=eth0 \
my_ipvlan
# 启动两个容器并连接到这个网络
docker run -d --name container5 --network my_ipvlan busybox sleep 3000
docker run -d --name container6 --network my_ipvlan busybox sleep 3000
# 在container5中ping container6
docker exec -it container5 ping container6
这个例子中,我们创建了一个名为my_ipvlan的ipvlan网络,并指定了父接口eth0和子网192.168.210.0/24。然后我们在这个网络上启动了两个容器container5和container6。然后我们在container5中执行ping命令,可以看到它能够成功地ping通container6,说明它们之间可以通信。
macvlan
- macvlan:这是另一种高级的网络模式,它可以让容器在网络上表现为物理设备。Docker守护进程会根据容器的MAC地址来路由流量。使用macvlan驱动有时是处理那些期望直接连接到物理网络,而不是通过Docker主机的网络栈路由的遗留应用程序的最佳选择²。一个简单的例子是:
# 创建一个macvlan网络,并指定父接口和子网
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my_macvlan
# 启动两个容器并连接到这个网络
docker run -d --name container7 --network my_macvlan busybox sleep 3000
docker run -d --name container8 --network my_macvlan busybox sleep 3000
# 在container7中ping container8
docker exec -it container7 ping container8
这个例子中,我们创建了一个名为my_macvlan的macvlan网络,并指定了父接口eth0和子网192.168.1.0/24。然后我们在这个网络上启动了两个容器container7和container8。然后我们在container7中执行ping命令,可以看到它能够成功地ping通container8,说明它们之间可以通信。
网络隔离机制
Docker 的网络隔离机制是通过使用 Linux 内核的网络命名空间和 Linux bridge 技术来实现的。Docker 默认会为每个容器创建一个独立的网络命名空间,每个网络命名空间包含一个独立的网络栈和网络接口。这种网络隔离机制可以确保容器之间的网络互相隔离,从而避免容器之间的网络冲突和干扰。
以下是一些 Docker 的网络隔离机制的细节:
- Bridge 网络模式
Docker 默认使用 Bridge 网络模式来实现容器之间的网络隔离。在这种模式下,Docker 会创建一个名为 docker0 的虚拟网桥,所有容器的网络接口都会连接到这个网桥上。每个容器都会被分配一个独立的 IP 地址,并且容器之间可以通过 IP 地址相互通信。Docker 还可以为每个容器分配一个独立的 DNS 名称,从而使得容器之间可以通过 DNS 名称相互通信。
以下是一些 Docker 命令,可以用来查看和管理 Docker 的 Bridge 网络模式:
docker network ls
- 列出所有 Docker 网络。docker network inspect <NETWORK>
- 查看指定 Docker 网络的详细信息。docker network create <NETWORK>
- 创建一个新的 Docker 网络。docker network connect <NETWORK> <CONTAINER>
- 将指定容器连接到指定 Docker 网络上。docker network disconnect <NETWORK> <CONTAINER>
- 将指定容器从指定 Docker 网络上断开连接。
- Host 网络模式
除了 Bridge 网络模式,Docker 还支持 Host 网络模式。在 Host 网络模式下,容器和宿主机共享同一个网络栈和网络接口,从而使得容器可以直接使用宿主机的网络接口和 IP 地址。这种模式可以提高容器的网络性能,但是容器之间的网络隔离会变得更加脆弱。
以下是一些 Docker 命令,可以用来启动一个使用 Host 网络模式的容器:
docker run --network=host <IMAGE>
- 其他网络模式
除了 Bridge 和 Host 网络模式之外,Docker 还支持一些其他的网络模式,例如 None 网络模式和 Overlay 网络模式。在 None 网络模式下,容器没有任何网络接口,从而使得容器无法与其他容器或宿主机通信。在 Overlay 网络模式下,可以在多个 Docker 主机之间创建一个虚拟的 Overlay 网络,从而使得不同主机上的容器可以相互通信。
以下是一些 Docker 命令,可以用来启动一个使用其他网络模式的容器:
docker run --network=none <IMAGE>
docker network create --driver=overlay <NETWORK>
docker run --network=<NETWORK> <IMAGE>
总之,Docker 的网络隔离机制是通过使用 Linux 内核的网络命名空间和 Linux bridge 技术来实现的。通过这种机制,Docker 可以确保每个容器都有自己独立的网络栈和网络接口,从而避免容器之间的网络冲突和干扰。