swarm是Docker自带的容器集群管理工具。
主机名 | ip地址 | 网卡名 | 软件 |
---|---|---|---|
master | 192.168.108.201 | ens33 | Docker |
node1 | 192.168.108.202 | ens33 | Docker |
修改主机名
# 管理节点,修改主机名
hostnamectl set-hostname master
# 子节点,修改主机名
hostnamectl set-hostname node1
# 查看主机名
hostname
# 初始化Manager节点的swarm
docker swarm init --advertise-addr 192.168.108.201
# 返回值
Swarm initialized: current node (7jq3yqkt84eoivhnuiubz850m) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-09b9ti7lmz8bkuzfqy3hqra9g0vrczxkjfynwmrtroy9b4rv47-321reydmf5huvndx4ung11d69 192.168.108.201:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 将node1节点加入集群
docker swarm join --token SWMTKN-1-09b9ti7lmz8bkuzfqy3hqra9g0vrczxkjfynwmrtroy9b4rv47-321reydmf5huvndx4ung11d69 192.168.108.201:2377
# 查看工作节点的 token
docker swarm join-token worker
# 查看管理节点的 token
docker swarm join-token manager
# 查看集群
docker node ls
# 返回值
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
7jq3yqkt84eoivhnuiubz850m * master Ready Active Leader 18.09.6
wt3u2sue87bawx6iytkckvqg0 node1 Ready Active 18.09.6
# 查看node1节点详情
docker node inspect node1
# 将node1节点升级,由工作节点升级为管理节点,node1的MANAGER STATUS变为Reachable
docker node promote node1
# 将node1节点降级,由管理节点降级为工作节点
docker node demote node1
# 更新node1节点
docker node update node1
# 查看当前节点中任务
docker node ps
# 删除node1节点(-f强制删除)
docker node rm node1
1 创建服务
# 在两个节点上获取镜像
docker pull nginx:1.20.0
# 创建3个nginx服务,swarm会自动将容器分配到不同的宿主机上
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.20.0
2 查看服务
# 查看服务
docker service ls
# 查看当前节点中任务
docker node ps
# 查看服务日志
docker service logs nginx
# 查看服务的详情
docker service inspect nginx
3 服务扩容与缩减
# 扩容
docker service scale nginx=5
# 缩减
docker service scale nginx=2
4 删除服务
docker service rm nginx
推荐使用swarm集群服务,此方法不够灵活,容器被固定在了不同的宿主机中。
# 注意必须添加--attachable参数,否则会报如下错误: docker: Error response from daemon: Could not attach to network overlay-cluster: rpc error: code = PermissionDenied desc = network overlay-cluster not manually attachable.
# --attachable: 表示可以手动挂载容器
docker network create --driver overlay overlay-cluster --attachable
在不同的宿主机上创建alpine容器
# 在master节点上创建容器
docker run -itd --rm --name alpine-master --net overlay-cluster alpine:3.13.0 /bin/sh
# 在node1节点上创建容器
docker run -itd --rm --name alpine-node1 --net overlay-cluster alpine:3.13.0 /bin/sh
# 进入master节点上的容器
docker exec -it alpine-master /bin/sh
# ping node1上的alpine-node1
ping alpine-node1
Docker Stack解决大规模部署管理问题,Docker引擎在1.12 版本集成了Docker Swarm, 内置新的容器编排工具docker stack,通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理。
docker-compose.yml
version: "3.7"
services:
mysql:
image: nginx:1.20.0
hostname: nginx
networks:
- overlay
ports:
- 80:80
deploy:
mode: replicated
replicas: 3
networks:
overlay:
部署docker-compose文件
# 部署新stack或更新现有stack
# -c 参数指定 compose文件
# stack的名称 nginx-stack
docker stack deploy -c docker-compose.yml nginx-stack
# 返回值
Creating network nginx-stack_overlay
Creating service nginx-stack_mysql
# 此时可以访问80端口的nginx服务
http://192.168.108.201/
nginx截图
查看stack信息
# 显示stack列表
docker stack ls
# 返回值
NAME SERVICES ORCHESTRATOR
nginx-stack 1 Swarm
# 列出stack中的任务
docker stack ps nginx-stack
# 返回值
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
er6ak0dt6zvi nginx-stack_mysql.1 nginx:1.20.0 master Running Running 2 minutes ago
uriohm4ew1gx nginx-stack_mysql.2 nginx:1.20.0 node1 Running Running 2 minutes ago
fkkqo4dchban nginx-stack_mysql.3 nginx:1.20.0 node1 Running Running 2 minutes ago
# 列出stack中的服务
docker stack services nginx-stack
# 返回值
ID NAME MODE REPLICAS IMAGE PORTS
lasx9zcszyvy nginx-stack_mysql replicated 3/3 nginx:1.20.0 *:80->80/tcp
# 删除stack
docker stack rm nginx-stack
# 返回值
Removing service nginx-stack_mysql
Removing network nginx-stack_overlay
Removing network nginx-stack_nginx-net