swarm和compos一样,都是Docker公司推出的官方容器编排项目,但不同的是,Docker compose 只能在单个服务器或者主机上创建多个容器,而swarm则可以在多个服务器或者主机上创建多个容器集群服务。

一、配置好hosts文件,安装好docker

准备三台虚拟主机,我的机器环境如下:

主机名:manage IP:  192.168.8.204 ,为swarm集群的管理者

主机名:node1 IP:192.168.8.121 ,集群中的node1节点机器

主机名:node2 IP : 192.168.8.159 ,集群中的node2节点机器

1、修改hosts配置文件,每台机器都要配置

vim  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.204 manage
192.168.8.121 node1
102.168.8.205 node2
                   

2、关闭防火墙,也是三台机器都要设置

systemctl stop firewalld
systemctl disable firewalld

3、安装docker

#卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库


yum install -y yum-utils

#国内源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#下载安装docker引擎
yum install docker-ce docker-ce-cli containerd.io

二、创建swarm集群

1、创建manage节点

#初始化一个manage节点
[root@manage docker]# docker swarm init --advertise-addr 192.168.8.204
Swarm initialized: current node (jajscvbi3c3jiudy8av7d886r) is now a manager.

To add a worker to this swarm, run the following command:
    # 这条语句用来添加node节点的秘钥,提前保存好
    docker swarm join --token SWMTKN-1-57a3i61b6kk8wu90qswalpnmjxn7lj6yt9ckf47nnmncizwnit-5jg00wka9g9kb7g2tovs8gc8r 192.168.8.204:2377

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

2、添加节点到swarm集群

在节点主机上执行(node1和node2上执行)之前保存好的秘钥

docker swarm join --token SWMTKN-1-57a3i61b6kk8wu90qswalpnmjxn7lj6yt9ckf47nnmncizwnit-5jg00wka9g9kb7g2tovs8gc8r 192.168.8.204:2377

如果想要添加更多的节点到这个swarm集群中,方法都是一样的

这样我们的集群swarm集群已经搭建好了

3、我们在manage节点上可以查看一下节点的状态(在node节点不能执行)

docker node ls

4、更改节点的availability状态

        swarm集群中,node节点的状态有两种,一个是active。一个是drain。

active状态下。node节点可以接受来自manage节点分派的任务:drain状态下,node节点会结束task,且不在接受来自manage节点的任务分派,就相当于下线了这个节点。

#active状态改为drain状态
docker node update --avalability drain node1

三、在swarm集群中部署nginx服务

1、创建一个网络部署服务(可省略)

docker network create -d overlay chen_nginx

其实当我们创建好swarm集群时,会自动给我们创建一个ingress网络,创建服务时不指定网络的话默认会使用ingress网络

2、部署服务

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

--network   指定网络空间

--replicas  指定副本数

3、查询正在运行的服务

docker service ls

4、查询服务的详细信息

#后接服务的名称
docker service inspect my-nginx

5、查看服务在哪个节点上运行

#在manage节点上运行,后接服务名
docker service ps test_nginx

6、swarm的动态扩展服务(可扩展性)

使用scale进行容器的扩容,增加scale数后,会创建新的容器,所以需要等待一段时间服务才会创建成功

使用docker service update命令,可以对服务的启动、参数进行更改

#将服务扩展到六个
docker service scale my-nginx=6

docker service update --replicas 8 my_nginx

在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上

三、在swarm中使用volume

1、首先创建一个volume

docker volume create --name chen-volume

2、查看刚刚创建的卷

docker volume ls


# 查看卷的详情可以使用

docker volume inspect chen-volume

3、创建新的服务挂载chen-volume卷

docker service create --replicas 3 --mount type=volume,src=chen-volume,dst=/data --name chen_nginx nginx

4、进入容器内部测试

docker exec -it 63451219cb4e /bin/bash

cd /data
mkdir chenxiongwei

然后退出去看你创建的卷的里面是否同样创建了一个相同的文件

路径:/var/lib/docker/volumes/chen-volume/_data

四、多服务部署

当我们一次要部署多个不同的服务(NGINX服务、MySQL服务,Redis服务),这个时候就需要结合docker 的compose编排方式进行统一的编排。compose可以在单台主机上进行多容器的编排工作,刚好可以和swarm结合进行多服务的部署。

1、编写一个docker-compose.yml文件

mkdir my_compose_swarm
cd my_compose_swarm
vim docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx
    ports:
      - 8888:80
    deploy:
      mode: replicated
      replicas: 3
 
  mysql:
    image: mysql
    ports:
      - "3306:3306"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
 
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

2、通过这个yml文件部署服务

[root@manage compose]# docker stack deploy -c docker-compose.yml deploy_deamon
Updating service deploy_deamon_redis (id: nxwecwxfjo6shnh5ptom98tsm)
Creating service deploy_deamon_nginx
Creating service deploy_deamon_mysql

3、查看创建的服务

[root@manage compose]# docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE          PORTS
qoj95c47c2yq   deploy_deamon_mysql   replicated   0/1        mysql:latest   *:3306->3306/tcp
v04xggrasmup   deploy_deamon_nginx   replicated   3/3        nginx:latest   *:7777->80/tcp
nxwecwxfjo6s   deploy_deamon_redis   replicated   1/1        redis:latest   *:6379->6379/tcp

可以看到服务已经起来了

五、swarm的调度策略

Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.

1)Random

顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运行的容器的数量来计算应该运行容器的节点。

2)Spread

在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。

使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。

3)Binpack

Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

七、命令集合

docker swarm :集合管理 init ,leave, update (docker swarm --help 查看帮助)
docker service :服务创建 create ,inspect,update, remove,tasks
docker node :节点管理 ls,rm,inspect,update,promote

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐