一、Docker Swarm 概述

Docker Swarm Mode 官方文档

在新版本 Docker 中,Swarm 已经集成到 Docker Engine 中,安装完 Docker Engine 后,服务器天然支持 swarm 模式。

简单来说,Docker Swarm 将所有的机器汇总起来进行管理,包括:内存资源、CPU资源等,从软件层面将所有的机器汇总成一台“大机器”。
Docker Swarm 提供了统一的用户终端入口,管理所有加入到 Docer Swarm 中的集群,每一个节点对应一个 Docker daemon(即一台机器或虚拟机)。

官方一点来说,Docker Swarm 是管理 Docker 应用的编排管理工具,Docker Swarm 提供一个用户终端实现在多个 Docker node 节点集群中的服务创建和部署。

Docker Swarm 中的每一个节点都是一个 Docker Daemon ,所有的 Docker Daemon 通过 Docker API 进行通讯。

1.1、docker swarm 角色概念

image.png
Dockers Swarm 中根据节点(docker daemon所在机器)是否有集群操作权限划分为

  • Manager Node(管理节点)
  • Worker Node(工作节点)

Manager Node 有两种运行方式:

  • 允许部署服务容器
  • 只作为管理节点

1.2、service 和 task

Service 和 Task 是 Docker Swarm 针对一个或多个一起运行的容器单独定义的抽象概念。
其本质对应的就是一个或者多个运行的容器。

1.2.1、task

task(任务)是 Docker Swarm 中最小的调度资源,对应的就是一个 Docker Container。

1.2.2、service

service(服务)是一组 task(任务)的集合。
service(服务)启动有两种模式

  • 以副本的方式部署
    根据指定的副本数在可用节点上尽可能的部署指定的节点数
  • 以全局的方式部署
    每个可用node 节点上都部署一个task(任务)

1.3、Docker Swarm 功能特点

1.3.1、Docker Engine 原生支持

Docker Swarm 已经集成到 Docker Engine 中,安装了Docker 默认就支持 Docker Swarm 。针对 Docker 集群的管理,无需在额外安装其他软件。

1.3.2、Swarm 和 Docker 分散设计

Docker 集成 Swarm 采用分散设计。即在构建了 Swarm 集群,只有在进行管理节点(manager)通过特殊命令进行服务部署的时候,才会生效。
不使用 docker Swarm 命令,在任何节点(manager node or worker node)同样可以直接使用 docker 命令进行容器的启动。

1.3.3、快速扩缩容

关于 service(服务)可以直接指定需要运行的 task(任务)数量,可以很方便的进行 service(服务)的扩缩容

1.3.4、状态监控和服务协调

Docker Swarm 提供对 service(服务)的监控,同时根据 service(服务)状态以及设置的容器数量,尽可能的保持容器数据量达到相应的设置值。
比如:设定 service(服务)指定 10个 task(任务),Docker swarm 监控到其中2个 task(任务)挂了,将在其他可用的 node 节点中在创建两个新的 task(任务)。

1.3.5、多主机网络

Docker Swarm 提供了 overlay network,overlay network 在软件层面将不同 node 节点串联成一个局域网,是的不同 node 节点的容器通过 overlay network 进行内部IP进行网络的访问。

1.3.6、服务发现

Docker Swarm 为每个 service(服务)提供了唯一的 DNS 名称 和负载均衡机制。
在访问容器时可以直接使用 DNS 名称进行访问。

1.3.7、负载均衡

Docker Swarm 允许将 service(服务)端口暴露出来给外部的负载均衡器进行负载均衡处理(如:nginx)。

1.3.8、默认安全认证

集群中的每个节点强制TLS相互认证和加密,以确保自身与所有其他节点之间的通信安全。您可以选择使用自签名根证书或来自自定义根CA的证书。

1.3.9、滚动升级

在进行 service(服务)升级时允许延迟滚动升级,当出现问题时,允许快速回滚。

二、Docker Swarm 基础API

2.1、Docker Swarm 集群管理 API

swarm 集群节点有三种状态:”active”|”pause”|”drain

  • active:工作状态
  • pause:暂停状态
  • drain:master 节点只管理节点不进行容器部署,只担任管理员的角色

2.1.1、创建/加入/退出 集群

创建 swarm 集群

  1. ## 创建 swarm 集群,并指定 manager 节点
  2. docker swarm --init --advertise-addr ${manager 节点ip}

生成加入集群的 token

## 在 manager 节点上执行,创建加入 swarm 集群的token,选定加入身份 worker|manager
docker swarm  join-token worker|manager

加入 swarm 集群

## 加入 swarm 集群
docker swarm join --token xxxxx

离开集群(解散集群)

## 离开 swarm 集群
docker swarm leave

## 管理节点离开 swarm 节点(如果没有其他节点只剩manager 则解散整个 swarm 集群)
docker swarm leave --force

2.1.2、节点提权/降权

## 对节点身份进行管理,将 worker 节点提权为 manager 节点,或者将 manager 节点降级为 worker 节点
docker node promote ${节点名称}  // 提权
docker node demote ${节点名称} // 降权

2.1.3、节点标签管理

每个主机不同的配置适合部署不同的应用,比如CPU密集型、IO密集型。 给不同的swarm node 打上不同的标签,在部署服务时指定特定的标签,优先将服务部署在特定标签的节点上

## 给节点打标签(更多命令使用 --help 即可查看)
docker node update --label-add ${标签} ${节点}

2.2、service(服务)管理

2.2.1、创建 service

# command:docker service create xxx 
# example:创建 nginx service(服务),副本模式,指定2个副本数
docker service create --replicas 2 --name web_nginx nginx

2.2.2、查看 service 信息

# 查看当前所有 service(服务)
docker service ls

# 查看指定 service(服务)
docker service inspect (--pretty) ${服务名}

2.2.3、快速扩缩容

# 指定更多的副本数进行扩容
docker service scale web_nginx=3

# 指定更少的副本数进行缩容
docker service scale web_nginx=2

2.2.4、service 滚动更新

docker service create --replicas 3 --name redis --update-delay 10s  redis:3.0.6
## 更新版本,暂停旧的 redis 版本不删除
docker service update --image redis:3.0.7 redis

2.2.5、service 删除

docker service rm ${服务名}