全网最全的docker-swarm入门教程

1. 什么是 Docker Swarm

    Docker Swarm 是用来管理 Docker 集群的工具,从 Docker v1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中。官方文档:Docker Swarm Official

2. 与 Docker Compose 的异同

    两者都是为了简化容器化应用程序的部署、管理扩展的工具:

  • 1. 相同点:两者都是为了简化容器化应用程序的部署和管理。
  • 2. 不同点
    • Docker Compose:适用于单机上的容器化应用程序编排。
    • Docker Swarm:用于容器化应用程序在生产环境中的需求,提供集群管理和容器编排功能。

3. Docker Swarm 的工作原理

3.1 基本概念

  • 节点 (Node):Swarm 集群中的每个 Docker 主机。
    • Manager 节点:负责集群管理和控制,可以有多个,但只有一个 Leader。
    • Worker 节点:接收来自 Manager 节点的任务并执行相应的容器操作。
  • Raft 协议:用于选举Manager节点的Leader(至少2个Manager节点参与选举),并确保Manager节点之间的状态信息同步。

3.2 工作流程

  • 集群初始化:使用 docker swarm init 初始化集群,执行该命令的主机会自动成为 Manager 节点(Leader)。
  • 节点加入:其他 Docker 主机可以通过 Manager 节点提供的 token 加入集群。
  • 服务定义:用户定义服务来描述容器应用程序,Manager 节点负责任务调度(任务是swarm中的最小调度单位,表现为一个单一的容器。服务是一组任务的集合且定义了任务属性)。
  • 调度策略:Leader节点根据调度策略(spread-默认,binpack和random),在集群中选择合适的节点来部署容器实例。
  • 容器编排:Leader节点负责对容器进行编排和管理,包括创建、启动、停止、重启容器实例等操作。

4. Swarm 集群管理

4.1 准备工作

  • 2 个 Manager 节点和 2 个 Worker 节点
    • Manager1:192.168.5.101,hostname=manager1
    • Manager2:192.168.5.102,hostname=manager2
    • Worker1:192.168.5.103,hostname=worker1
    • Worker2:192.168.5.104,hostname=worker2

4.2 初始化集群

  • 在 Manager1 上执行命令:docker swarm init --advertise-addr=192.168.5.101
    • 说明:参数–advertise-addr叫做广播地址。指定其他节点用来与当前节点通信的IP(端口默认2377)这一参数是可选的,当节点上有多个IP时(多网卡情况),最好指定使用哪个IP。
    • 特别说明:命令执行成功后,Swarm会自动将当前节点作为Manager节点并自动生成集群的token。
  • token分两类:管理token和工作token,分别用于其他的管理节点和工作节点加入集群使用。
docker swarm join-token worker    #管理节点查看工作token

docker swarm join-token manager   #管理节点查看管理token

4.3 加入节点

  • 加入Manager2节点。Manager2上执行如下命令:
    • docker swarm join --advertise-addr=Manager2的广播地址 --token 管理token Manager1广播地址:2377
    • 例如:docker swarm join --advertise-addr=192.168.5.102 --token SWMTKN-1-2e40bfiw4djkimlzzfk3o88893bj69qtb5pe9shc4qlflexg6u-8yhth9a72fd5ebiiaae1qqfox 192.168.5.101:2377。
  • 加入worker1、worker2节点。在对应的节点上执行如下命令:
    • docker swarm join --advertise-addr=Worker的广播地址 --token 工作token Manager1广播地址:2377。
    • 例如:docker swarm join --advertise-addr=192.168.5.103 --token SWMTKN-1-2e40bfiw4djkimlzzfk3o88893bj69qtb5pe9shc4qlflexg6u-6u24u39mfkvhklsv4xd4l86xe 192.168.5.101:2377。

4.4 集群解散

docker swarm leave --force     # 节点退出集群,manager节点退出加--force
docker node rm 退出节点的主机名     # Manager上操作

5. 节点管理

    注意:节点管理命令均在管理节点上操作,工作节点无操作权限。

5.1查看集群节点

docker node ls    #查看集群所有节点
docker node inspect 节点的主机名    #查看集群指定节点

5.2节点升级和降级

docker node promote 节点的主机名     # worker升级成manager
docker node demote 节点的主机名      # manager降级成worker

5.3 节点下线

docker node update --availability drain 节点的主机名 #节点暂停接受任务

5.4节点上线

docker node update --availability active 节点的主机名 #节点重新接受任务

6. 服务管理

    注意:节点管理命令均在管理节点上操作,工作节点无操作权限。

6.1 服务定义

docker service create --name 服务名 [-d] [-p] [-e] [--network] [--replicas] [--mount] image:tag
说明: 
	-d 代表后台运行
	-p 代表端口映射
	-e 代表环境变量
	--network 代表使用的网络
	--replicas 代表副本数量
	--mount 代表文件系统挂载
	image:tag 代表基础镜像和tag

6.2服务查看

docker service ls              #查看集群中的所有服务
docker service ps 服务名      #查看集群中的指定服务(包含服务运行的节点)

6.3 服务移除

docker service rm服务名        #移除集群中的一个或多个服务

6.4服务模式

docker service create ... --mode replicated ... 
说明:副本服务模式(默认)。在每个 node 上可以运行一个或多个副本

docker service create ... --mode global ...
说明:全局服务模式。强制在每个 node 上都运行一个副本(例如收集所有容器的日志)

6.5 服务日志

docker service logs 服务名

7. Swarm 集群的弹性伸缩

    弹性伸缩就是动态的增加或减少集中某个服务的任务数目:

docker service create -d --name mydb --replicas=2 \
-p 3306:3306
-e MYSOL ROOT PASSWORD=123456 \
mysql:5.7

7.1 实现方式一

docker service update --replicas 新副本数 服务名

7.2 实现方式二

docker service scale 服务名=新副本数

8. Swarm 集群服务的滚动更新

    滚动更新允许在不停止服务的情况下更新服务,也称为灰度更新。

docker service update
--image 基础镜像
--update-delay 定义滚动更新的时间间隔(默认0),单位如s、m、h,1h28m30s即1小时20分30秒
--update-parallelism 定义并行更新的最大数量(正更新的这些任务不可用)
服务名

8.1 visualizer镜像

    可让Swarm的服务滚动更新实时显示在UI界面上,便于观察滚动更新的过程。

  • manager1节点上执行:
docker service create \
--name=viz \
--publish=888:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
  • 访问manager1节点的viz服务:
    • http://manager1节点IP:8088/
    • http://192.168.5.101:8088

8.2 实验:升级MySQL服务基础镜像(v5.7 --> v8.0),由原来2个副本扩展到5个副本,每60秒扩容5个

9. Swarm中使docker compose

    在Swarm上运行Docker Compose是一种将Docker Compose文件部署到Docker Swarm集群的方法。Docker Compose是一个用于定义和运行多个Docker容器的工具,而Swarm是Docker的原生容器编排和集群管理工具。

    Docker Compose文件是一个YAML格式的文件,用于定义应用程序的各个服务、网络、卷等配置。通过在Swarm集群上运行Docker Compose文件,可以实现在多个主机上同时部署和管理应用程序。

  • 注意:docker create service的缺点,一个命令仅能创建一个service,对于多service的应用程序而言,实属繁琐

9.1 docker compose

docker-compose.yml中有关swarm集群的属性

version: '3.8'

services:
  my_service:
    image: your_image_name  # 替换为你的镜像名
    deploy:
      replicas: 2  # 服务的副本数量
      mode: replicated  # 服务的模式(副本模式)
      placement:  # 服务部署的目标节点
        constraints:
          - node.id==nodeid  # 根据节点id部署任务
          - node.hostname==nodehostname  # 根据节点主机名部署任务
      restart_policy:  # 指定服务部署的重启策略
        condition: on-failure  # none不重启; on-failure容器故障时
        delay: 10s  # 尝试重启的时间间隔(默认5s)
        max_attempts: 3  # 最多的尝试次数(默认无限制)
  • 说明:docker-compose up方式会忽略 deploy 部分的内容!

9.2 docker stack

   Swarm堆栈管理工具,可以结合docker-compose实现多service应用程序的部署。
   官网文档:https://docs.docker.com/reference/cli/docker/stack/。

docker stack deploy -c yml文件 自定义STACK名
docker stack ls
docker stack ps 自定义STACK名
docker statck down 自定义STACK名

10. 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值