目 录

  • 1. 简 介
  • 2. Swarm的工作模式
  • 3. Swarm的使用示例
  • 3.1 准备工作
  • 3.2 创建集群
  • 3.3 使用集群
  • 3.4 部署项目


1. 简 介

Docker Compose用于在单一的服务器或者主机上,创建并运行多个容器;而Docker Swarm则用于在多个服务器或者主机上,创建并运行集群服务。

最简单的理解类似于一个Docker Swarm操作多个Docker Compose,每个Docker Compose创建多个容器,从而实现集群服务。

Docker Swarm的官方文档,由于Docker已经自带了Docker Swarm,所以安装好Docker后,直接使用就好,不用额外安装Docker Swarm。

2. Swarm的工作模式

  1. 节点(Node)
  2. 服务(Service)与任务(Task)
  3. 任务与调度
  4. 副本与全局服务

3. Swarm的使用示例

3.1 准备工作

1、购买同一个地域即在同一个安全组的阿里云服务器4台,可以选择按小时或者按日、月计费,配置好服务器的网络、登录密码等等,总之先准备好能用的安装有CentOS的服务器

2、在各个服务器上安装好Docker

以上是主要的准备工作,为了描述方便,这里假设,4台服务器的ip以及作用如下:

  • 服务器-1:172.26.82.140 ----准备设置为manager
  • 服务器-2:172.26.82.141 ----准备设置为worker
  • 服务器-3:172.26.82.142 ----准备设置为worker
  • 服务器-4:172.26.82.143 ----准备设置为manager

3.2 创建集群

1、在服务器-1上,执行如下命令,表示要将服务器-1设置为manager节点,并且设置自身的通讯ip为172.26.82.140

docker swarm init --advertise-addr 172.26.82.140

命令执行完成后,大致会得到类似下面的信息:

Swarm initialized: current node (s0eoali1x32ly22jo85ebeb0w) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-57msikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.26.82.140:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2、将服务器-2设置为worker节点。在服务器-2上,执行如下命令:

docker swarm join --token SWMTKN-1-57msikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.26.82.140:2377

3、同样的,将服务器-3设置为worker节点。在服务器-3上,执行以下命令:

docker swarm join --token SWMTKN-1-57msikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.26.82.140:2377

4、将服务器-4设置为manager节点。

  • 步骤一:在服务器-1执行下面的命令,获取一个添加manager的令牌
docker swarm join-token manager
  • 假设得到的令牌信息如下:
docker swarm join --token SWMTKN-1-4a1sikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.26.82.140:2377
  • 步骤二:将上面的令牌信息复制到服务器-4,执行。服务器-4机会得到如下信息:
This node joined a swarm as a manager.

至此,两个manager、两个worker的swarm集群就搭建完毕。后面如果还要扩展集群,增加manager、worker节点的,类似的方式进行添加即可。

按官网所述,一个标准的集群,起码要有3个或3个以上的manager节点,多个worker节点。

假如集群中标识为Leader的manager节点挂掉,那么集群会自动通过Raft协议从其它manager节点中,选择出一个Leader。

Raft协议:保证大多数节点存活,才可以使用,保证高可用性。

5、获取令牌的命令

# 获取manager令牌的命令
docker swarm join-token manager

# 获取worker令牌的命令
docker swarm join-token worker

3.3 使用集群

manager节点是管理集群的入口,在集群环境中,docker命令只能在manager节点上执行,worker节点是无法执行docker命令的。

下面的操作,都需要在manager节点上进行,这里假设都在服务器-1上。

  • 查看当前节点信息
docker node ls
  • 创建服务
# 使用nginx镜像,创建1个名字为my-nginx的服务,给这个服务起3个副本(也就是同时运行3个容器)
  docker service create --replicas 3 --name my-nginx -p 8088:80 nginx:latest
  • 查看运行中的服务列表
docker service ls
  • 查看具体某个服务运行信息
docker service ps my-nginx
  • 查看运行了哪些容器
docker ps
  • 动态扩缩容某个服务的容器个数
# 运行my-nginx的容器的个数,扩展到7个
docker service scale my-nginx=7

#也可用update这个命令进行扩缩容,缩减到2个
docker service update --replicas 2 my-nginx
  • 上线、下线节点
# 下线服务器-2节点
docker node update --availability drain 服务器-2

# 上线服务器-2节点
docker node update --availability active 服务器-2
  • 移除一个服务
docker service rm my-nginx
  • 节点退出集群
# 这个命令可以在所有节点上执行
docker swarm leave

#强制退出集群
docker swarm leave -f

当最后一个manager节点离开集群,则swarm集群自动删除。

3.4 部署项目

之前在单机上部署项目,使用的是docker-compose,如下:

docker-compose up -d xxxxx.yaml

现在,在集群里部署项目,使用命令docker stack,如下:

docker stack deploy xxxxx.yaml