Docker - Swarm mode

🌌 基本概念

Docker Swarm 是使用 Docker 构建的原生集群管理和编排工具。想要有效地使用 Swarm,首先需要了解以下核心概念:


1. 🖥️ 节点 (Node)

  • 节点是运行 Docker 的主机,它可以初始化或加入一个已存在的 Swarm 集群,从而成为该集群的一个部分。

  • 节点类型

    • 管理 (Manager) 节点: 主要负责集群的管理工作。docker swarm 命令主要在此节点上执行。虽然一个集群中可以有多个管理节点,但只有一个可以成为 leader。leader 使用 raft 协议进行管理。
    • 工作 (Worker) 节点: 负责执行任务。管理节点将服务任务分配给工作节点。需要注意的是,管理节点默认也可以作为工作节点。

🖼️ 一个形象的比喻:你可以将 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

这将显示你的服务的每个实例及其状态,帮助你了解服务的整体健康状况。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值