目录
[一. 默认网络驱动程序](#一. 默认网络驱动程序)
[a. Bridge 网络](#a. Bridge 网络)
[b. Host 网络](#b. Host 网络)
[c. Overlay 网络](#c. Overlay 网络)
[d. Macvlan 网络](#d. Macvlan 网络)
[二. 网络模式](#二. 网络模式)
[三. 网络配置和管理](#三. 网络配置和管理)
[四. 端口映射和暴露](#四. 端口映射和暴露)
Docker 的网络模型为容器提供了灵活的网络配置选项,使得容器可以彼此通信,也可以与外部世界进行交互。Docker 支持几种主要的网络驱动程序,每种驱动程序都适用于不同的场景。以下是 Docker 网络模型的主要组成部分:
一. 默认网络驱动程序
a. Bridge 网络
-
特点:
- 这是 Docker 的默认网络驱动程序。
- 在单台主机上,容器通过虚拟网桥(
docker0
)进行通信。在Docker中,docker0
是一个虚拟网桥,用于容器之间的通信以及容器与宿主机之间的通信。当你安装并启动Docker服务时,docker0
网桥会自动创建。这个网桥通常使用一个私有网络地址范围,默认是172.17.0.0/16
。使用ip addr show docker0可查看详细信息。 - 容器在桥接网络上使用私有 IP 地址,相互之间可以直接通信,但外部主机需要通过端口映射来访问容器。
-
使用方式:
bash# --driver bridge 指定了网络类型为桥接网络 docker network create --driver bridge my_bridge_network
b. Host 网络
-
特点:
- 容器直接使用主机的网络堆栈,没有网络隔离。
- 性能更高,但容器与主机共享网络,可能带来安全隐患。
- 当容器使用
host
网络模式时,它将直接使用宿主机的网络接口,因此,容器内的服务可以通过宿主机的网络接口直接暴露给外部网络。这种网络模式适用于那些需要直接使用宿主机网络环境的容器,比如某些网络应用或服务
-
使用方式:
bash# 在这个命令中,--network host 指定了容器应该使用宿主机的网络命名空间。 docker run --network host my_image
host
网络模式的主要特点是:
- 共享网络命名空间:容器和宿主机共享相同的网络命名空间。
- 无网络隔离:容器不拥有自己的网络栈,因此与宿主机之间没有网络隔离。
- 性能优势 :由于不经过网络地址转换(NAT),
host
网络模式通常在网络性能上优于桥接网络。
c. Overlay 网络
-
特点:
- 主要用于 Docker Swarm 集群中,使得跨主机的容器可以通信。
- 通过 VXLAN 隧道实现多主机间的网络覆盖。
在Docker中,Overlay网络是一种跨多个主机工作的网络,它允许运行在不同主机上的容器之间进行通信。Overlay网络通常用于Swarm集群模式,其中多个Docker宿主机被配置为一个集群,共同工作以运行分布式应用程序。
Overlay网络的关键特性包括:
- 跨主机通信:容器可以跨越不同的宿主机进行通信,这对于微服务架构和分布式应用非常重要。
- 加密传输:Overlay网络通常使用加密技术来确保容器之间的通信安全。
- 动态服务发现:在Swarm集群中,服务可以通过Overlay网络自动发现其他服务,即使它们位于不同的宿主机上。
- 可扩展性:Overlay网络可以随着集群的扩大而扩展,支持成千上万的容器和服务。
要创建一个Overlay网络,通常是在Swarm集群模式下进行的。可以使用以下命令:
bash
docker network create -d overlay my-overlay-network
在这个命令中,-d overlay
指定了网络类型为Overlay网络,my-overlay-network
是新网络的名称。
在Swarm集群中,创建服务时可以指定使用这个Overlay网络:
bash
docker service create --name my-service --network my-overlay-network my-image
在这个命令中,--network my-overlay-network
指定了服务应该连接到名为 my-overlay-network
的Overlay网络。
d. Macvlan 网络
-
特点:
- 容器直接获得一个物理网络接口的 MAC 地址,适用于需要容器拥有独立 IP 地址的场景。
- 容器能够像普通网络设备一样与网络设备进行交互,适合与传统网络设备集成的场景。
Macvlan 是 Docker 支持的一种网络驱动,它允许你为容器分配一个或多个独特的 MAC 地址,并让它们出现在物理网络上,就像物理设备一样。Macvlan 网络可以让你将一个物理网络接口(如 eth0)分割成多个虚拟网络接口,每个接口都可以有自己的 IP 地址和 MAC 地址。
Macvlan 的主要特点包括:
- MAC 地址隔离:每个 Macvlan 接口都有自己的 MAC 地址,这提供了比传统的桥接网络更高的隔离性。
- 直接连接:Macvlan 容器直接连接到物理网络,不需要经过 Docker 桥接网络,这可以提供更好的网络性能。
- 易于管理:Macvlan 网络可以很容易地集成到现有的网络基础设施中,因为它遵循标准的网络协议。
要在 Docker 中使用 Macvlan,首先需要确保系统支持 Macvlan,并且你的网络管理员允许使用它。然后,可以使用以下命令创建一个 Macvlan 网络:
bash
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan-network
在这个命令中:
-d macvlan
指定网络驱动为 Macvlan。--subnet
和--gateway
指定了子网和网关。-o parent
指定了父接口,即宿主机上的物理网络接口。
创建 Macvlan 网络后,你可以运行容器并指定使用这个网络:
bash
docker run -d --name my-container --network my-macvlan-network my-image
使用 Macvlan 网络的容器将直接连接到父接口所在的物理网络,并且可以像物理设备一样进行通信。
扩展:
- 自定义网络:
在Docker中,自定义网络是一种功能,它允许用户根据特定需求创建和管理网络。自定义网络的区分主要是基于不同的网络驱动程序和配置选项,这些驱动程序和选项提供了不同的网络功能和特性,以满足不同的使用场景。
- Swarm
Swarm 是 Docker 官方提供的一个集群管理工具,用于管理多个 Docker 宿主机,使它们协同工作,形成一个高可用、可扩展的集群环境。Swarm 提供了以下主要功能:
集群管理:Swarm 可以管理多个 Docker 宿主机,使它们作为一个整体运行。管理员可以在 Swarm 集群中添加或移除宿主机,而不会影响到集群中运行的应用。
服务编排:Swarm 允许用户定义和部署服务,包括服务所需的容器数量、资源限制、网络配置等。Swarm 会自动根据定义的规则来调度和管理这些服务。
负载均衡:Swarm 能够自动在不同的宿主机之间分配负载,确保服务的高可用性和性能。
服务发现:Swarm 提供服务发现功能,允许容器通过服务名称相互通信,而不需要知道彼此的 IP 地址。
滚动更新:Swarm 支持滚动更新,允许用户平滑地更新服务,减少服务中断。
Swarm 集群由两种类型的节点组成:
管理节点(Manager Nodes):负责处理集群的编排任务,如服务部署、更新、故障转移等。
工作节点(Worker Nodes):执行由管理节点分配的任务,如运行容器、处理网络请求等。
二. 网络模式
-
None :
none
网络是一种特殊的网络模式,它表示容器没有网络接口。当容器连接到none
网络时,它将完全与外部网络隔离,没有任何网络通信能力。这种网络模式可以用于需要完全隔离和安全的场景。
bash
docker run --network none my_image
-
Container :
container
网络模式是一种让容器共享另一个容器的网络命名空间的网络模式。当使用container
网络模式时,新创建的容器不会获得自己的网络接口,而是与指定的容器共享IP地址和端口等网络资源。这意味着两个容器将共享相同的网络栈,包括网络接口、IP地址、端口等。bashdocker run --network container:other_container my_image
- 容器与另一个容器共享网络命名空间,共享 IP 地址和端口。可以通过
--network container:<container_id>
参数进行配置。
- 容器与另一个容器共享网络命名空间,共享 IP 地址和端口。可以通过
三. 网络配置和管理
网络创建
创建一个自定义网络并指定驱动程序:
bash
docker network create --driver bridge my_custom_network
网络连接
将容器连接到指定网络:
bash
docker network connect my_custom_network my_container
网络断开
将容器从指定网络中断开:
bash
docker network disconnect my_custom_network my_container
查看网络
列出所有网络:
bash
docker network ls
查看网络的详细信息:
bash
docker network inspect my_custom_network
四. 端口映射和暴露
端口映射
将主机端口映射到容器端口:
bash
docker run -p 8080:80 my_image
端口暴露
在 Dockerfile 中声明容器要暴露的端口:
bash
EXPOSE 80
EXPOSE
指令不进行端口映射,仅仅是文档化容器预期要使用的端口,实际的端口映射需通过 docker run -p
实现。