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