6.1 Docker Swarm
基本概念
Docker Swarm
是 Docker 提供的内置容器编排系统。它让你可以创建、管理和扩展由 Docker 主机组成的集群,把它们变成一个可供运行容器的逻辑主机。Swarm 会自动在节点之间分配任务,提供方便性和容错能力。这节课我们会学习 Docker Swarm
的关键组件和基础管理命令。
Docker Swarm
的基本概念:
- 集群 (Swarm): 一组 Docker 主机组成的逻辑集群。
- 管理节点 (Managers): 管理集群并分配任务给工作节点的节点。
- 工作节点 (Workers): 执行任务并运行容器的节点。
- 服务 (Services): 应用的逻辑表示,描述需要执行的任务以及需要运行多少个容器实例。
- 任务 (Tasks): 作为服务实例的单个容器。
Docker Swarm
的架构:
Docker Swarm 采用基于管理节点和工作节点的架构。管理节点负责集群状态管理,而工作节点执行任务。
管理节点:
- 管理集群的状态与配置。
- 在工作节点之间分配任务。
- 提供容错和高可用性 (当存在多个管理节点时)。
工作节点:
- 执行管理节点分配的任务。
- 根据任务运行容器。
Docker Swarm
的基本命令:
-
docker swarm init
: 初始化新的 Swarm 集群。 -
docker swarm join
: 加入节点到现有集群。 -
docker node ls
: 查看集群中的节点列表。 -
docker service create
: 创建一个新服务。 -
docker service ls
: 查看正在运行的服务。 -
docker service scale
: 扩展服务到指定数量的实例。 -
docker service rm
: 从集群中删除服务。
使用 Docker Swarm
可以简化分布式系统中的应用管理,提供容错能力、可扩展性和部署的方便性。
6.2 创建 Docker Swarm
集群
创建和管理 Docker Swarm 集群
步骤 1: 初始化集群
在第一个主机(管理员)上执行以下命令:
docker swarm init --advertise-addr <MANAGER_IP>
这条命令会初始化一个新的 Swarm 集群,将当前节点变为管理员,并输出用于连接工作节点的命令。
步骤 2: 加入工作节点
在其他主机上执行 docker swarm init
输出的命令,将其加入到集群中:
docker swarm join --token <SWARM_TOKEN> <MANAGER_IP>:2377
其中:
<SWARM_TOKEN>
: 用于连接集群的令牌(由docker swarm init
提供)。<MANAGER_IP>
: 管理员节点的 IP 地址。
步骤 3: 查看节点
使用以下命令查看集群中的所有节点:
docker node ls
这条命令将显示所有节点的列表,包括它们的角色、状态和可用性。
docker node ls
命令的输出示例
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
qwertyuiop12345 manager-node Ready Active Leader
asdfghjkl67890 worker-node1 Ready Active
zxcvbnm09876 worker-node2 Ready Active
列解释:
- ID: 节点的唯一标识符。
- HOSTNAME: 运行节点的主机名。
- STATUS: 节点的当前状态(比如 Ready)。
- AVAILABILITY: 节点的可用性(比如 Active)。
- MANAGER STATUS: 显示节点是否为管理员(比如 Leader, Reachable) 或工作节点(空)。
现在 Docker Swarm 集群已经配置好,你可以用它来创建和扩展应用程序了。
6.3 管理 Docker Swarm
管理 Docker Swarm
的服务
1. 创建服务
创建一个具有指定副本数量的服务:
docker service create --name my_web --replicas 3 -p 8080:80 nginx
在这个例子中,会创建一个名为 my_web
的服务,运行 3 个 Nginx 实例。容器会将端口 80 暴露到主机的端口 8080。
2. 查看服务
要查看集群中所有正在运行的服务,请使用以下命令:
docker service ls
命令 docker service ls
的输出示例
ID NAME MODE REPLICAS IMAGE
ab12345 my_web replicated 3/3 nginx:latest
3. 服务扩展
要更改服务的实例(副本)数量,请使用命令 docker service scale
:
docker service scale my_web=5
现在服务 my_web
将有 5 个实例。
4. 更新服务
要将服务的镜像更新到新的版本,请使用命令 docker service update
:
docker service update --image nginx:latest my_web
实现高可用性
Docker Swarm 通过以下方式支持高可用性:
- 任务分配:在集群节点之间分配任务,在故障时自动恢复容器。
- 支持多个管理节点:建议使用奇数数量的管理节点(例如 3 或 5 个),以避免 quorum 的问题。
- 使用副本:为每个服务设置多个副本,以提高容错能力。
Quorum 的概念
Quorum 是指 多数节点 必须对某个操作(例如数据写入或领导者选举)达成一致,使其生效。例如,在一个 5 节点的集群中,quorum 是 3 个节点。
有用的建议!
确保管理节点分布在不同的物理或云服务器上,以尽量减少同时发生故障的风险。
6.4 一个Docker Compose
的Docker Swarm
配置示例
Docker Compose
可以和Docker Swarm
一起使用,以简化多容器应用程序的管理。
文件docker-compose.yml
的示例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080-8090:80"
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
- my_overlay_network
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
deploy:
replicas: 1
restart_policy:
condition: on-failure
networks:
- my_overlay_network
networks:
my_overlay_network:
driver: overlay
在Swarm
中启动Docker Compose
堆栈
要在Docker Swarm
中部署堆栈,请使用以下命令:
docker stack deploy -c docker-compose.yml mystack
查看堆栈
查看已部署的堆栈:
docker stack ls
查看堆栈中的服务
docker stack services mystack
GO TO FULL VERSION