Docker Swarm 是 Docker 官方提供的容器编排工具,它能够让你轻松地将多个 Docker 主机组合成一个集群,进行服务的编排和管理。本文将全面介绍 Docker Swarm 的概念、如何创建和管理 Swarm 集群、服务的编排与管理,并探讨 Swarm 模式下的网络与存储配置。
1. Docker Swarm 概述
Docker Swarm 提供了一个简单的方式来管理多个 Docker 容器,支持集群管理、服务发现、负载均衡和滚动更新等功能。它使得容器集群的管理变得更加简单高效。
核心概念
- Manager 节点:负责集群的管理和协调,包括服务部署、负载均衡和任务调度。一个 Swarm 集群至少需要一个 Manager 节点。
- Worker 节点:负责运行服务容器,接受 Manager 节点的指令。
- Service:定义了运行在集群中的容器的集合,可以设置副本数、负载均衡策略等。
- Task:Service 的具体实例,每个 Task 是一个容器实例。
2. 创建和管理 Swarm 集群
准备工作
确保所有节点已经安装了 Docker,并且 Docker 版本为 1.13 及以上。以下命令在所有节点上进行安装和配置:
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
初始化 Swarm 集群
在管理节点上,使用以下命令初始化 Swarm 集群:
docker swarm init --advertise-addr <MANAGER_IP>
--advertise-addr
指定 Swarm 集群的 IP 地址,通常是管理节点的 IP。
运行上述命令后,输出类似如下的信息:
Swarm initialized: current node (xxxxxx) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377
To add a manager to this swarm, run the following command:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377 --manager
添加 Worker 节点
在每个 Worker 节点上,使用从管理节点复制的命令加入 Swarm 集群:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377
确保替换 <TOKEN>
和 <MANAGER_IP>
为实际的值。
验证集群状态
在管理节点上,使用以下命令查看集群状态:
docker node ls
输出示例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abcd1234 manager-node Ready Active Leader 20.10.7
efgh5678 worker-node-1 Ready Active 20.10.7
ijkl9012 worker-node-2 Ready Active 20.10.7
3. 服务编排与管理
Docker Swarm 允许你定义和管理服务,通过服务编排来实现容器的自动扩展和负载均衡。以下是创建和管理服务的具体步骤。
定义服务
创建一个简单的 Web 服务,使用 nginx
镜像,指定副本数为 3:
docker service create --name web --replicas 3 -p 80:80 nginx
--name
指定服务名称。--replicas
指定服务的副本数。-p
映射端口。
查看服务状态
使用以下命令查看服务的状态:
docker service ls
输出示例:
ID NAME MODE REPLICAS IMAGE PORTS
abc1234 web replicated 3/3 nginx *:80->80/tcp
查看服务详情
查看服务的详细信息,了解每个 Task 的状态:
docker service ps web
输出示例:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xyz5678 web.1 nginx manager-node Running Running 8 minutes ago
uvw9101 web.2 nginx worker-node-1 Running Running 8 minutes ago
rst2345 web.3 nginx worker-node-2 Running Running 8 minutes ago
更新服务
可以使用以下命令更新服务,例如将副本数增加到 5:
docker service update --replicas 5 web
删除服务
删除服务的命令如下:
docker service rm web
4. Swarm 模式下的网络与存储
网络配置
Docker Swarm 支持多种网络模式,默认的网络模式是 overlay 网络,可以跨多个主机进行通信。
创建自定义网络
在 Swarm 集群中创建一个 overlay 网络:
docker network create --driver overlay my_overlay_network
启动服务并连接网络
在指定网络的情况下启动服务:
docker service create --name web --network my_overlay_network -p 80:80 nginx
存储配置
Docker Swarm 也支持数据卷和数据卷集(Volume)管理,确保数据在服务重启或迁移时仍然可用。
创建数据卷
创建一个名为 my_data_volume
的数据卷:
docker volume create my_data_volume
使用数据卷
在启动服务时,将数据卷挂载到容器:
docker service create --name db --mount source=my_data_volume,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 mysql:5.7
高级网络配置
Docker Swarm 还支持配置不同的网络策略,如:
- 覆盖网络(overlay network):适用于跨多个主机的服务通信。
- 桥接网络(bridge network):适用于同一主机上的服务通信。
例如,创建一个桥接网络:
docker network create --driver bridge my_bridge_network
示例完整案例
下面是一个完整的 Docker Swarm 配置案例,演示如何创建一个 Web 服务和一个数据库服务,使用自定义网络和数据卷。
docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_overlay_network
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
volumes:
- my_data_volume:/var/lib/mysql
networks:
- my_overlay_network
networks:
my_overlay_network:
driver: overlay
volumes:
my_data_volume:
启动 Swarm 集群并部署应用
-
初始化 Swarm 集群:
docker swarm init --advertise-addr <MANAGER_IP>
-
添加 Worker 节点:
docker swarm join --token <TOKEN> <MANAGER_IP>:2377
-
使用 Docker Compose 部署服务:
docker stack deploy -c docker-compose.yml my_stack
-
查看服务状态:
docker stack services my_stack
-
查看服务的具体实例:
docker service ps my_stack_web