🌌 基本概念
Docker Swarm 是使用 Docker 构建的原生集群管理和编排工具。想要有效地使用 Swarm,首先需要了解以下核心概念:
1. 🖥️ 节点 (Node)
-
节点是运行 Docker 的主机,它可以初始化或加入一个已存在的 Swarm 集群,从而成为该集群的一个部分。
-
节点类型:
- 管理 (Manager) 节点: 主要负责集群的管理工作。
docker swarm
命令主要在此节点上执行。虽然一个集群中可以有多个管理节点,但只有一个可以成为 leader。leader 使用 raft 协议进行管理。 - 工作 (Worker) 节点: 负责执行任务。管理节点将服务任务分配给工作节点。需要注意的是,管理节点默认也可以作为工作节点。
- 管理 (Manager) 节点: 主要负责集群的管理工作。
🖼️ 一个形象的比喻:你可以将 Swarm 集群想象为一个公司,管理节点是公司的管理层,而工作节点则是执行实际工作的员工。
2. 🚀 服务 (Services) & 任务 (Tasks)
-
任务 (Task): 是 Swarm 中的基本调度单位,可以简单地理解为一个容器。
-
服务 (Services): 定义了一组任务的属性。它是多个任务的集合。有两种主要的服务模式:
- 复制 (Replicated) 服务: 根据规则在各工作节点上运行指定数量的任务。
- 全局 (Global) 服务: 每个工作节点上运行一个任务。
🖼️ 想象一下,服务就像是一个项目,而任务则是完成这个项目所需的各个步骤或组件。例如,一个网站服务可能需要多个相同的 Web 服务器任务来处理大量的流量。
🔍 形象化的解释:
Docker Swarm 的结构就像一个军队。管理节点是指挥官,他们决定如何分配任务,而工作节点就像士兵,执行实际的任务。服务和任务是这支军队执行的实际“任务”。而每一个小任务都由一个容器执行,这些容器在整个集群中运行,协同工作,完成最终的大任务。
🛠️ 创建 Swarm 集群
在 Docker 中, Swarm 是一个强大的集群管理工具。以下是创建包含一个管理节点和两个工作节点的 Swarm 集群的步骤:
1. 🌍 初始化集群
首先,我们需要在已经安装了 Docker 的主机上初始化集群。这可以通过以下命令完成:
$ docker swarm init --advertise-addr 192.168.99.100
🔍 输出:
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意: 如果你的 Docker 主机有多个 IP 地址,你必须使用 --advertise-addr
指定一个 IP 地址。
执行此命令后,当前节点自动成为管理节点。
2. 🤖 增加工作节点
初始化 Swarm 集群后,你将拥有一个管理节点。接下来,你可以在其他两个 Docker 主机上运行以下命令,将它们作为工作节点加入集群:
$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
🔍 输出:
This node joined a swarm as a worker.
3. 🧐 查看集群
现在,你已经有了一个包含一个管理节点和两个工作节点的 Swarm 集群。在管理节点上,你可以使用以下命令查看集群的状态:
$ docker node ls
🔍 输出:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662 worker2 Ready Active
9j68exjopxe7wfl6yuxml7a7j worker1 Ready Active
dxn1zf6l61qsb1josjja83ngz * manager Ready Active Leader
🖼️ 形象化解释: 想象 Swarm 集群就像一个团队。管理节点是团队的领导,负责指导和监督,而工作节点是执行实际任务的团队成员。使用 docker node ls
命令就像查看团队名单,可以看到每个成员的状态和角色。
🚀 部署服务
在 Swarm 中, 我们可以使用 docker service
命令来管理和部署服务。下面是如何进行这些操作的步骤:
1. 🌱 新建服务
在你创建的 Swarm 集群中, 让我们运行一个 nginx 服务:
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
🌐 现在, 打开任意浏览器并输入任意节点的 IP 地址, 你应该可以看到 nginx 的默认页面。
2. 🧐 查看服务
- 📜 使用以下命令查看当前 Swarm 集群中运行的所有服务:
$ docker service ls
🔍 输出:
ID NAME MODE REPLICAS IMAGE PORTS
kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
- 📖 查看特定服务的详细信息:
$ docker service ps nginx
🔍 输出:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
... [其他输出]
- 📔 查看服务日志:
$ docker service logs nginx
🔍 输出:
... [nginx 相关日志]
3. 📈 服务伸缩
随着业务需求的变化, 我们可能需要增加或减少某个服务的容器数量:
- 📦 扩展服务 (例如, 在业务高峰期):
$ docker service scale nginx=5
- 📉 减少服务 (例如, 当业务较为平稳):
$ docker service scale nginx=2
4. 🗑️ 删除服务
如果你不再需要某个服务, 你可以使用以下命令从 Swarm 集群中删除它:
$ docker service rm nginx
📌 总结: 使用 docker service
命令可以帮助你轻松地在 Swarm 集群中管理和部署服务。
📘 使用 Compose 文件
在 Swarm 中, 使用 Compose 文件可以帮助你配置和部署多个服务。以下是操作的步骤和说明:
1. 📝 Compose 文件说明
你可以使用 docker-compose.yml
文件来定义和运行多个服务。例如,以下是在 Swarm 集群中部署 WordPress 的 Compose 文件:
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:
2. 🚀 部署服务
为了在 Swarm 集群中使用 docker-compose.yml
文件,我们使用 docker stack
命令。以下是详细说明:
-
部署:
使用
docker stack deploy
并指定-c
参数来选择 Compose 文件名:$ docker stack deploy -c docker-compose.yml wordpress
🌐 打开浏览器并输入
任一节点IP:8080
,你可以查看各个节点的运行状态。
再打开新的浏览器标签页并输入任一节点IP
,你将看到 WordPress 的安装界面。
3. 🧐 查看服务
查看当前运行的服务:
$ docker stack ls
🔍 输出:
NAME SERVICES
wordpress 3
4. 🗑️ 移除服务
如果你想移除服务:
$ docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default
该命令将停止服务并移除相关的网络。但请注意,它不会移除服务所使用的数据卷。如果你需要移除数据卷,请使用:
$ docker volume rm [volume_name]
🔐 管理密钥
在分布式环境中,对于敏感信息如密码、证书的管理和分发显得尤为重要。Docker 提供了 secrets
功能,允许用户在 Swarm 集群中安全地存储和管理这些敏感信息。
1. 🌟 创建 secret
首先,我们可以使用 docker secret create
命令来创建 secret。例如:
$ openssl rand -base64 20 | docker secret create mysql_password -
$ openssl rand -base64 20 | docker secret create mysql_root_password -
这里,我们使用了 openssl
来生成随机的密码,然后将其作为 secret 存储。
2. 🧐 查看 secret
使用 docker secret ls
可以列出所有创建的 secrets:
$ docker secret ls
ID NAME CREATED UPDATED
l1vinzevzhj4goakjap5ya409 mysql_password 41 seconds ago 41 seconds ago
yvsczlx9votfw3l0nz5rlidig mysql_root_password 12 seconds ago 12 seconds ago
3. 🚀 创建服务并使用 secret
创建 MySQL 服务,其中使用了之前创建的 secrets:
$ docker network create -d overlay mysql_private
$ docker service create \
--name mysql \
--replicas 1 \
--network mysql_private \
--mount type=volume,source=mydata,destination=/var/lib/mysql \
--secret source=mysql_root_password,target=mysql_root_password \
--secret source=mysql_password,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_USER="wordpress" \
-e MYSQL_DATABASE="wordpress" \
mysql:latest
此外,为 WordPress 服务设置相应的 secret:
$ docker service create \
--name wordpress \
--replicas 1 \
--network mysql_private \
--publish target=30000,port=80 \
--mount type=volume,source=wpdata,destination=/var/www/html \
--secret source=mysql_password,target=wp_db_password,mode=0444 \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
-e WORDPRESS_DB_HOST="mysql:3306" \
-e WORDPRESS_DB_NAME="wordpress" \
wordpress:latest
在这里,我们使用了 --secret
参数来指定服务应如何访问之前创建的 secrets。
5. 🌐 查看服务
$ docker service ls
ID NAME MODE REPLICAS IMAGE
wvnh0siktqr3 mysql replicated 1/1 mysql:latest
nzt5xzae4n62 wordpress replicated 1/1 wordpress:latest
6. 🌐 访问服务
现在,你可以通过浏览器访问 IP:30000
来启动和使用 WordPress。
📌 注意:通过 docker secret
功能,我们可以确保敏感数据的安全性,而不是通过环境变量或其他易于泄露的方式来传递这些数据。
🔧 管理配置信息
在大规模的分布式集群中,对配置文件的管理和分发是至关重要的。Docker 提供了 config
功能,允许用户在 Swarm 集群中安全地存储和管理配置文件。
1. 🌟 创建 config
首先,你可以通过以下方式创建一个新的配置文件 redis.conf
:
echo "port 6380" > redis.conf
接着,使用 docker config create
来创建 config:
$ docker config create redis.conf redis.conf
2. 🧐 查看 config
你可以使用 docker config ls
来列出所有创建的 configs:
$ docker config ls
ID NAME CREATED UPDATED
yod8fx8iiqtoo84jgwadp86yk redis.conf 4 seconds ago 4 seconds ago
3. 🚀 创建服务并使用 config
利用之前创建的 config 来部署 Redis 服务:
$ docker service create \
--name redis \
--config source=redis.conf,target=/etc/redis.conf \
-p 6379:6380 \
redis:latest \
redis-server /etc/redis.conf
在这里,我们使用了 --config
参数来指定服务如何访问之前创建的 config。如果你没有在 target 中显式的指定路径时,默认的 redis.conf 以 tmpfs 文件系统挂载到容器的 /config.conf。
4. 💡 总结
利用 docker config
, 你无需在集群的每个节点手动放置配置文件。当你在集群中的管理节点上创建 config 时,Docker 会自动将配置文件分发到运行服务的各个节点上。这大大简化了配置信息的管理和分发流程,并提高了系统的可维护性和可扩展性。
🔄 滚动升级 & 回退
在动态的、大规模的分布式集群中,服务的持续升级和回退是至关重要的。Docker 的 Swarm 模式提供了灵活、高效的工具来实现这些目标。
1. 🚀 滚动升级
在 Swarm mode 中, 你可以很容易地进行滚动升级而不会中断服务。例如, 如果你想将 NGINX 服务升级到一个新的版本,只需使用以下命令:
$ docker service update \
--image nginx:1.13.12-alpine \
nginx
这将平滑地升级你的服务,确保在整个过程中始终有可用的实例。
以上命令使用 --image 选项更新了服务的镜像。当然我们也可以使用 docker service update 更新任意的配置。
–secret-add 选项可以增加一个密钥
–secret-rm 选项可以删除一个密钥 更多选项可以通过 docker service update -h 命令查看。
2. 🔄 服务回退
如果你发现新版本的服务有问题,Swarm mode 允许你轻松地回退到之前的版本:
$ docker service rollback nginx
这将恢复到上一个服务版本,确保你的服务始终可用。
3. 🧐 查看服务状态
你可以使用以下命令查看服务的详细信息,包括其升级和回退的历史:
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
rt677gop9d4x nginx.1 nginx:1.13.7-alpine VM-20-83-debian Running Running about a minute ago
d9pw13v59d00 \_ nginx.1 nginx:1.13.12-alpine VM-20-83-debian Shutdown Shutdown 2 minutes ago
i7ynkbg6ybq5 \_ nginx.1 nginx:1.13.7-alpine VM-20-83-debian Shutdown Shutdown 2 minutes ago
这将显示你的服务的每个实例及其状态,帮助你了解服务的整体健康状况。