环境:
主节点manager192.168.1.88
从节点node192.168.1.99
实际上manager也是一个node,manager获取客户端请求,对从节点进行调度工作
1.创建主节点
docker swarm init --advertise-addr 192.168.1.88
执行完成会出现一个注册从节点的命令
2.注册从节点
将上述命令在192.168.1.99上注册
docker swarm join --token SWMTKN-1-3mhx8nr3g3w1gc6uxyztzoys1v49e8lhqndj6pindvirhzlylk-2ebgshiazezm66cfxhyr6pjth 192.168.1.88:2377
显示注册成功
在使用之前先看看docker集群swarm的一些命令,其实它的命令和docker的某些命令非常相似,只是多加了一个service
docker service [commond]
命令 | 用途 |
---|---|
create | 创建新服务 |
inspect | 展示一个或多个服务的详细信息 |
logs | 查看服务的日志 |
ls | 列出服务 |
ps | 根据名称列出服务 |
rm | 删除一个或多个服务 |
ps | 缩放一个或多个复制服务 |
update | 更新服务 |
1.查看当前节点信息
docker node ls
2.查看当前网络信息
docker network ls
3.创建一个私有网络,供不同节点互通使用
docker network create -d overlay new_network
4.使用创建的网络部署服务
此处创建一个使用net_network网络且名为my_nginx的服务
–replicas 参数来指定此服务在工作节点上运行的任务数。此处表示一个
docker service create --replicas 1 --network new_network --name my_nginx -p 80:80 nginx:latest
5.查看运行的服务列表
docker service ls
6.查看服务在哪个节点运行
docker service ps my_nginx
7.动态扩容服务数量
docker service scale my_nginx=2
等同于命令docker service update --replicas 3 my_nginx
8.下线/上线节点
下线节点,下线后不参与任务分派,但是如果它原本有容器,那么这些容器会转移到其他可用节点上
docker node update --availability drain node2
上线节点
docker node update --availability active node2
9.移除任务,删除所有容器
docker rm my_nginx
10.节点离开集群
docker swarm leave (在要离开的节点上运行,在主节点执行则是删除集群)
以mysql搭建为例,正常我们使用docker,搭建命令如下:
docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql -v /home/mysql/logs:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
如果我们用服务创建,则命令如下:
docker service create --name=mysql -p 3306:3306 --mount type=bind,src=/home/mysql/logs,dst=/var/log/mysql --mount type=bind,src=/home/mysql/data,dst=/var/lib/mysql --mount type=bind,src=/home/mysql/conf,dst=/etc/mysql --env MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
不难看出来,差别还是挺大的,对应命令下表:
docker | swarm |
---|---|
docker run | docker service create |
-p | -p |
-v | —mount type=bind,src=,dst= |
-e | –env |
mysql服务搭建好以后又来了一个问题,我部署服务的时候,它自动给我分配节点,可是我想要指定节点,就需要给每个节点打上标签,在运行服务的时候,指定标签。
1.打标签
docker node update --label-add func=node node1
#func=node是自己指定的键值对,也可以指定其他的,在调用的时候注意替换就好了,node1是我们集群中hostname的名称
2.使用标签指定主机
还是以mysql为例
加上–constraint ‘node.labels.func == node’
docker service create --name=mysql -p 3306:3306 --constraint 'node.labels.func == node'
--mount type=bind,src=/home/mysql/logs,dst=/var/log/mysql --mount type=bind,src=/home/mysql/data,dst=/var/lib/mysql --mount type=bind,src=/home/mysql/conf,dst=/etc/mysql --env MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
其它还有更多用法正在完善中