Docker Swarm 基础入门:轻量级容器编排

好的,各位观众老爷,欢迎来到“Docker Swarm 基础入门:轻量级容器编排”讲座现场!我是你们的老朋友,一个在代码堆里摸爬滚打多年的老码农,今天就来跟大家聊聊 Docker Swarm 这个既实用又有趣的容器编排工具。

咱们先别急着谈什么高深的理论,想象一下,你是一位餐厅老板,你的餐厅生意火爆,一个厨房已经忙不过来了,你需要多个厨房协同工作,才能满足顾客的需求。Docker Swarm 就相当于你的厨房总调度,它能帮你管理多个 Docker 引擎,让它们像一个整体一样工作,高效地运行你的应用。

一、 什么是 Docker Swarm?

Docker Swarm 是 Docker 官方提供的容器编排工具,它允许你将多个 Docker 主机组成一个集群,并将应用部署到这个集群中。你可以把它想象成一个乐队指挥,指挥着多个乐器(Docker 引擎)协同演奏一首美妙的乐曲(你的应用)。

Swarm 的特点:

  • 原生集成: 作为 Docker 的一部分,Swarm 无需额外安装,直接可以使用 docker swarm 命令进行管理。就像你买了一辆自带导航的汽车,方便快捷!
  • 声明式服务模型: 你只需要告诉 Swarm 你想要什么样的服务(例如,需要几个副本、使用哪个镜像、暴露哪个端口),Swarm 就会自动帮你实现,并保持服务的状态。就像你跟餐厅服务员说“我要一份宫保鸡丁,多放辣椒”,服务员就会按照你的要求去做,并确保你一直能吃到热腾腾的宫保鸡丁。
  • 去中心化设计: Swarm 集群中的所有节点都可以参与管理,即使某个节点宕机,集群仍然可以正常工作。就像一个民主的团队,每个人都可以发表意见,即使领导不在,团队也能正常运转。
  • 服务发现: Swarm 会自动为服务分配 DNS 名称,并进行负载均衡,方便服务之间的互相调用。就像餐厅里的点餐系统,顾客可以通过菜单找到自己想吃的菜,厨房也会根据订单进行分配。
  • 滚动更新: Swarm 支持服务的滚动更新,可以在不中断服务的情况下,逐步更新应用的各个副本。就像给汽车换轮胎,你可以一个一个地换,而不需要把整个汽车停下来。
  • 扩展性: Swarm 可以轻松地扩展集群规模,只需要添加更多的 Docker 主机即可。就像餐厅生意越来越好,你可以不断地增加厨房,来满足更多的顾客。

二、 Swarm 的核心概念

要玩转 Swarm,我们需要了解几个核心概念:

  • Node (节点): Swarm 集群中的一台 Docker 主机,可以是物理机,也可以是虚拟机。就像乐队中的一位乐手,负责演奏自己的乐器。节点分为两种角色:
    • Manager Node (管理节点): 负责管理集群的状态,调度任务,处理 API 请求。就像乐队指挥,负责指挥乐队的演奏。
    • Worker Node (工作节点): 负责运行任务(容器)。就像乐队中的乐手,负责演奏乐器。
  • Service (服务): 应用的抽象,定义了应用的运行方式,例如使用哪个镜像,需要多少个副本,暴露哪些端口。就像乐队要演奏的乐曲,定义了乐器的种类、演奏的顺序、以及节奏。
  • Task (任务): 服务的具体实例,一个 Task 对应一个容器。就像乐队中的一个乐手演奏的音符,是乐曲的最小组成部分。
  • Stack (栈): 一组相关服务的集合,通常用于部署一个完整的应用。就像乐队要演奏的音乐专辑,包含了多首乐曲。

可以用一个表格来总结一下:

概念 解释 比喻
Node Swarm 集群中的一台 Docker 主机,可以是 Manager 或 Worker。 乐队中的乐手。
Manager Node 负责管理集群的状态,调度任务,处理 API 请求。 乐队指挥。
Worker Node 负责运行 Task (容器)。 乐队中的乐手,负责演奏乐器。
Service 应用的抽象,定义了应用的运行方式,例如使用哪个镜像,需要多少个副本,暴露哪些端口。 乐队要演奏的乐曲,定义了乐器的种类、演奏的顺序、以及节奏。
Task 服务的具体实例,一个 Task 对应一个容器。 乐队中的一个乐手演奏的音符,是乐曲的最小组成部分。
Stack 一组相关服务的集合,通常用于部署一个完整的应用。 乐队要演奏的音乐专辑,包含了多首乐曲。

三、 Swarm 的基本操作

接下来,咱们来一起动手,体验一下 Swarm 的基本操作。

1. 初始化 Swarm 集群

首先,我们需要在一台 Docker 主机上初始化 Swarm 集群,这台主机将成为 Manager Node。

docker swarm init --advertise-addr <你的主机IP>

这里的 <你的主机IP> 替换成你的主机的实际 IP 地址。执行成功后,会返回一段命令,用于将其他节点加入集群。

docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 192.168.1.100:2377

2. 加入 Swarm 集群

在其他的 Docker 主机上,执行上面返回的 docker swarm join 命令,将这些主机加入 Swarm 集群,这些主机将成为 Worker Node。

3. 查看 Swarm 集群状态

在 Manager Node 上,可以使用以下命令查看 Swarm 集群的状态:

docker node ls

这个命令会列出集群中的所有节点,以及它们的状态。

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
j07u8b9p8h9o5l4r8c7e6q3z7 *   manager1            Ready               Active              Leader              20.10.7
k2v3x5y7z9a1b3c5d6e7f8g9h   worker1             Ready               Active                                  20.10.7
l4w5y7z9a1b3c5d6e7f8g9hi2   worker2             Ready               Active                                  20.10.7

可以看到,manager1 是 Leader,也就是当前的 Manager Node。worker1worker2 是 Worker Node。

4. 部署服务

现在,我们来部署一个简单的 Nginx 服务。可以使用以下命令:

docker service create --name my-nginx --replicas 3 -p 80:80 nginx

这个命令会创建一个名为 my-nginx 的服务,使用 nginx 镜像,启动 3 个副本,并将主机的 80 端口映射到容器的 80 端口。

  • --name my-nginx: 指定服务名称为 my-nginx
  • --replicas 3: 指定运行 3 个容器副本
  • -p 80:80: 将宿主机的 80 端口映射到容器的 80 端口
  • nginx: 使用 nginx 镜像

5. 查看服务状态

可以使用以下命令查看服务状态:

docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
b7j9v5x3y1z5w7a9c2e4f6g8h   my-nginx            replicated          3/3                 nginx:latest        *:80->80/tcp

可以看到,my-nginx 服务的副本数是 3/3,表示 3 个副本都已启动并正常运行。

还可以使用以下命令查看服务的具体任务:

docker service ps my-nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
c9e1g3h5k7j9m1n3p5q7r9s1t   my-nginx.1          nginx:latest        worker1             Running             Running 2 minutes ago
d1f3h5j7k9l1m3n5p7q9r1s3t   my-nginx.2          nginx:latest        worker2             Running             Running 2 minutes ago
e3g5h7j9k1l3m5n7p9q1r3s5t   my-nginx.3          nginx:latest        manager1            Running             Running 2 minutes ago

可以看到,3 个副本分别运行在 worker1worker2manager1 上。

6. 访问服务

在浏览器中输入任意一个节点的 IP 地址,就可以访问 Nginx 服务了。因为 Swarm 会自动进行负载均衡,所以无论你访问哪个节点,都会被转发到其中一个 Nginx 容器。

7. 扩展服务

如果你的网站流量增加,需要更多的 Nginx 副本,可以使用以下命令扩展服务:

docker service scale my-nginx=5

这个命令会将 my-nginx 服务的副本数增加到 5 个。

8. 更新服务

如果你的应用需要更新,可以使用以下命令更新服务:

docker service update --image nginx:1.21 my-nginx

这个命令会将 my-nginx 服务的镜像更新到 nginx:1.21。Swarm 会自动进行滚动更新,逐步更新应用的各个副本,而不会中断服务。

9. 删除服务

如果不再需要某个服务,可以使用以下命令删除服务:

docker service rm my-nginx

这个命令会删除 my-nginx 服务,并停止所有相关的容器。

四、 使用 Docker Compose 部署 Stack

上面我们只是部署了一个简单的 Nginx 服务,实际应用通常包含多个服务。这时,我们可以使用 Docker Compose 来定义 Stack,并使用 Swarm 进行部署。

首先,创建一个 docker-compose.yml 文件,定义你的服务。例如:

version: "3.7"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

  redis:
    image: redis:alpine
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure

这个文件定义了两个服务:webredisweb 服务使用 nginx:latest 镜像,启动 3 个副本,并将主机的 80 端口映射到容器的 80 端口。redis 服务使用 redis:alpine 镜像,启动 1 个副本。

然后,使用以下命令部署 Stack:

docker stack deploy -c docker-compose.yml my-app

这里的 my-app 是 Stack 的名称。

可以使用以下命令查看 Stack 的状态:

docker stack ls
NAME                SERVICES            ORCHESTRATOR
my-app              2                   Swarm

可以使用以下命令查看 Stack 中的服务:

docker stack services my-app
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
m1n3p5q7r9s1t3u5v7w9x1y3z   my-app_web          replicated          3/3                 nginx:latest        *:80->80/tcp
o3q5r7s9t1u3v5w7x9y1z3a5b   my-app_redis        replicated          1/1                 redis:alpine

可以使用以下命令删除 Stack:

docker stack rm my-app

五、 Swarm 的高级特性

除了基本操作,Swarm 还提供了一些高级特性,可以帮助你更好地管理你的应用。

  • Secrets (密钥): 用于安全地存储敏感信息,例如数据库密码、API 密钥。
  • Configs (配置): 用于集中管理应用的配置信息,例如数据库连接字符串、日志级别。
  • Overlay Network (覆盖网络): 用于实现跨主机的容器通信。
  • Ingress Network (入口网络): 用于将外部流量路由到集群中的服务。
  • Health Check (健康检查): 用于监控服务的健康状态,并自动重启不健康的容器。

这些高级特性可以帮助你构建更健壮、更安全的容器化应用。

六、 Swarm 的优缺点

优点:

  • 简单易用: 作为 Docker 的一部分,Swarm 学习成本低,易于上手。
  • 轻量级: Swarm 资源占用少,适合小型应用和开发测试环境。
  • 高可用: Swarm 具有去中心化设计,可以容忍节点故障。
  • 与 Docker 生态系统集成: Swarm 可以与 Docker 的其他工具(例如 Docker Compose、Docker Registry)无缝集成。

缺点:

  • 功能相对简单: 与 Kubernetes 相比,Swarm 的功能相对简单,缺乏一些高级特性,例如自动扩缩容、复杂的调度策略。
  • 社区支持相对较少: 与 Kubernetes 相比,Swarm 的社区支持相对较少,遇到问题可能难以找到解决方案。

七、 Swarm vs Kubernetes

既然提到了 Kubernetes,那我们不妨简单对比一下 Swarm 和 Kubernetes。

特性 Docker Swarm Kubernetes
易用性 简单易用,学习成本低。 复杂,学习成本高。
功能 功能相对简单,缺乏一些高级特性。 功能强大,支持各种高级特性,例如自动扩缩容、复杂的调度策略。
资源占用 资源占用少,适合小型应用和开发测试环境。 资源占用多,适合大型应用和生产环境。
社区支持 社区支持相对较少。 社区支持强大,遇到问题容易找到解决方案。
适用场景 小型应用、开发测试环境、对资源占用要求较高的场景。 大型应用、生产环境、需要复杂调度策略的场景。

总的来说,Swarm 适合小型应用和开发测试环境,而 Kubernetes 适合大型应用和生产环境。选择哪个工具,取决于你的实际需求。

八、 总结

今天我们一起学习了 Docker Swarm 的基本概念和操作,希望能够帮助你入门 Docker Swarm。虽然 Swarm 的功能相对简单,但它仍然是一个非常有用的工具,尤其是在小型应用和开发测试环境中。

记住,技术没有好坏之分,只有适合与不适合。选择合适的工具,才能更好地解决你的问题。

最后,祝大家学习愉快,早日成为容器编排高手!感谢大家的观看,咱们下期再见! 👋

希望这篇讲座风格的文章能够帮助你更好地理解 Docker Swarm。如果还有什么问题,欢迎随时提问!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注