小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等着你们来哦!
温馨提醒:本文主要讲解docker-swarm实现docker集群,若小伙伴们对docker还不是很熟悉,请查阅上篇文章:Docker容器虚拟化技术
容器化部署=大麻烦
- 怎么保证数据完整性
- 怎么保护客户隐私数据
- 怎么去调度容器
- 怎么去监控追踪容器
- 怎么去更新容器而不影响客户的业务
- 如果容器down掉了。怎么自动恢复
- 怎么去管很多微服容器
- 怎么根据客户业务需求,快速方便的扩展容器
安装docker-swarm
官方文档
https://docs.docker.com/engine/swarm/
概述
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,可以将组成某个应该的多个docker容器 编排在一起,同时管理。而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,其主要作 用是把若干台Docker主机抽象为一个整体,并且通过一个入口(docker stack)统一管理这些Docker主 机上的各种Docker资源。
stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定 义每个服务。
stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并 定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
Docker Swarm由两部分组成:
- Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理;
- 应用编排:有一套API用来部署和管理容器
配置私有仓库
私有仓库不是集群必备的组件。集群的每个节点都需要安装镜像,如果不搭建私有仓库,下载镜像速度 比较耗时。
vi /etc/docker/daemon.json
"insecure-registries":["192.168.198.101:5000"]
systemctl daemon-reload
systemctl restart docker
初始化管理节点
master 192.168.150.141
node1 192.168.150.142
node2 192.168.150.136
关于advertise-addr和listen-addr这两个参数: 前者用来指定其他节点连接m0时的地址 后者指定承载swarm流量的IP和端口 会在本地新建docker网络
docker swarm init --advertise-addr 192.168.150.141:2377 --listen-addr 192.168.150.141:2377
查询节点
docker node ls
获取加入manager 、woker节点token
有效期24小时
docker swarm join-token manager
docker swarm join-token worker
节点权限升级降级
将worker节点提升为manager节点,在manager节点执行如下命令:
docker node promote node1
docker node ls
将manager节点降低为worker节点,在manager节点执行如下命令:
docker node demote node2
docker node ls
脱离集群
在ndoe2节点使用命令:
docker swarm leave
稍微等待几分钟,在manager节点使用命令:
docker node ls
发现node2节点已经脱离集群管理。
删除脱离集群的节点
先使用命令:docker node demote 节点名称。
将某一个节点降为worker节点后,再删除。(或在woker节点执行)
使用命令:docker node rm 节点名称|节点ID
例如:docker node rm work-02 manager节点只能强制退出。
命令:docker swarm leave --force。manager退出后意味着整个swarm 不复存在。
图形界面
docker官网
https://hub.docker.com/r/dockersamples/visualizer
基础镜像
拉取镜像 docker pull dockersamples/visualizer:latest
备份镜像 docker save dockersamples/visualizer:latest -o dockersamples.visualizer.tar
还原镜像 docker load -i dockersamples.visualizer.tar
运行镜像
必须在manager节点运行
docker run -itd --name visualizer -p 8099:8080 -e HOST=192.168.150.141 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer:latest
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
测试镜像
基础命令
swarm命令
- docker swarm init 初始化一个 swarm 群集
- docker swarm join 加入群集作为节点或管理器
- docker swarm join-token 管理用于加入群集的令牌
- docker swarm leave 离开 swarm 群集
- docker swarm unlock 解锁 swarm 群集
- docker swarm unlock-key 管理解锁钥匙
- docker swarm update 更新 swarm 群集
node命令
- docker node demote 从 swarm 群集管理器中降级一个或多个节点
- docker node inspect 显示一个或多个节点的详细信息
- docker node ls 列出 swarm 群集中的节点
- docker node promote 将一个或多个节点推入到群集管理器中
- docker node ps 列出在一个或多个节点上运行的任务,默认为当前节点
- docker node rm 从 swarm 群集删除一个或多个节点
- docker node update 更新一个节点
service命令
- docker service create 创建服务
- docker service inspect 显示一个或多个服务的详细信息
- docker service logs 获取服务的日志
- docker service ls 列出服务
- docker service rm 删除一个或多个服务
- docker service scale 设置服务的实例数量
- docker service update 更新服务
- docker service rollback 恢复服务至update之前的配置
stack命令
- docker stack deploy 部署新的堆栈或更新现有堆栈
- docker stack ls 列出现有堆栈
- docker stack ps 列出堆栈中的任务 d
- ocker stack rm 删除一个或多个堆栈
- docker stack services 列出堆栈中的服务
部署nginx集群
部署
在manager节点中创建overlay网络:
docker network create -d overlay nginx-net
创建5个nginx:alpines容器的集群:
docker service create --name nginx --network nginx-net -p 80:80 --replicas 5 nginx:1.18.0-alpine
在manager节点使用docker service ls 命令查看服务情况,worker节点无法查看:
docker service ls
在manager或者worker节点都可以执行docker ps命令查看本虚拟机容器情况:
docker ps
manager节点只用于管理集群,不希望部署服务(驱离)。
docker node update --availability drain master
使用docker service scale nginx=2命令将服务缩减为2个容器:
docker service scale nginx=2
升级nginx版本
旧版本
进入其中一个容器查看nginx的版本信息: 注意事项:因nginx是alpine的linux版本。不能使用/bin/bash指令。
docker exec -it 503fe639bb89 sh nginx -v
1.更新镜像: docker service update --image nginx:1.19.3-alpine nginx
2.添加或者更新一个对外端口: docker service update --publish-add 8090:80 nginx
overlay网络调度
192.168.150.141主机并没有部署nginx,但能访问,主要是overlay网络服务调度
删除服务
docker service rm nginx
docker network rm nginx-net
stack
docker-compose.yml
运行nginx
在manager节点中创建docker-compose.yml文件。执行如下命令:
docker stack deploy nginx-stack --compose-file=docker-compose.yml
或者是 docker stack deploy nginx-stack -c docker-compose.yml
查看stack服务运行情况。执行如下命令:
docker stack services nginx-stack
查看5个容器运行在哪个节点中。执行如下命令:
docker service ls
查看到NAME中的服务名为:nginx-stack_nginx-web
docker service ps nginx-stack_nginx-web
进行测试:
curl 192.168.0.105
curl 192.168.0.106
curl 192.168.0.107
删除stack服务。执行如下命令:
docker stack rm nginx-stack
总结
- networks中也可以不指定driver:overlay,因为docker swarm默认网络类型是overlay。
- 整个networks都可以不用配置。stack部署时会默认创建网络。如果我们定义网络。在docker stack deploy时会先默认创建一个网络,在创建一个我们定义的网络。
- 一定要把镜像先拉取到本地再执行
Docker Stack和Docker Compose区别
- Docker stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建 好的。 所以docker-compose更适合于开发场景;
- Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。所以需要安 装Docker -compose,以便与Docker一起在您的计算机上使用; Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是 swarm mode的一部分。
- Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而 Docker Compose对版本为2和3的 文件仍然可以处理;
- docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时, 对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker 新手,或正在选择用于新项目的技术,请使用docker stack。