高级架构师_Docker_第3章Docker运维管理__ 第1节Swarm集群管理
Swarm集群管理
节点信息
服务器用户名:root,服务器密码:123456 。及时做好系统快照。
image.png
硬件要求
最低的硬件配置要求为2CPU,2GB内存,50GB硬盘
当前应用状态
image.png
容器化部署=大麻烦
怎么保证数据完整性
怎么保护客户隐私数据
怎么去调度容器
怎么去监控追踪容器
怎么去更新容器而不影响客户的业务
如果容器down掉了。怎么自动恢复
怎么去管很多微服容器
怎么根据客户业务需求,快速方便的扩展容器
image.png
安装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由两部分组成:
1)Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理;
2)应用编排:有一套API用来部署和管理容器
image.png
配置私有仓库
私有仓库不是集群必备的组件。集群的每个节点都需要安装镜像,如果不搭建私有仓库,下载镜像速度比较耗时。
vi /etc/docker/daemon.json
"insecure-registries":["192.168.198.101:5000"]
systemctl daemon-reload
systemctl restart docker
初始化第一个管理节点
关于advertise-addr和listen-addr这两个参数:
- 1)前者用来指定其他节点连接m0时的地址
- 2)后者指定承载swarm流量的IP和端口
- 3)会在本地新建docker网络
docker swarm init --advertise-addr 192.168.198.105:2377 --listen-addr
192.168.198.105:2377
docker node ls
docker network ls
如何加入新的节点
Docker Swarm的新节点加入策略是从管理节点获取一长串命令,被称为join token,任何想加入集群的机器只要自己执行这个join token即可加入Swarm集群;
如果有新的管理节点需要加入,在m0执行命令docker swarm join-token manager即可得到管理manager节点的join token,
如果有新的work节点需要加入,在m0执行命令docker swarm join-token worker即可得到管理work节点的join token
在manager节点执行。可以作为manager节点加入集群
docker swarm join-token manager
在manager节点执行。可以作为worker节点加入集群
docker swarm join-token worker
docker node ls
manager节点说明
MANAGER STATUS列说明:
- 1)Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
- 2)Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
- 3)Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
AVAILABILITY列说明:
- 1)Active 意味着调度程序可以将任务分配给节点。
- 2)Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
- 3)Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。
验证节点
master节点:
docker info
work节点:
docker info
节点权限提升/降低
将worker节点提升为manager节点,在manager节点执行如下命令:
docker node promote work-01
docker node ls
将manager节点降低为worker节点,在manager节点执行如下命令:
docker node demote work-02
docker node ls
脱离集群
在work-02节点使用命令:docker swarm leave
稍微等待几分钟,在manager节点使用命令:docker node ls,发现work-02节点已经脱离集群管理。
删除脱离集群的节点
先使用命令:docker node demote 节点名称。将某一个节点降为worker节点后,再删除。
使用命令: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
运行镜像
docker run -itd --name visualizer -p 8099:8080 -e HOST=192.168.198.105 -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
测试镜像
http://192.168.198.105:8099
swarm命令
image.png
node命令
image.png
service命令
命令总结,如下图:
image.png
image.png
基础镜像配置
集群所有节点都需要下载相关镜像
# 下载指定的nginx版本
docker pull nginx:1.18.0-alpine
docker pull nginx:1.19.3-alpine
scp nginx.1.18.tar root@192.168.198.106:/data/
scp nginx.1.18.tar root@192.168.198.107:/data/
scp nginx.1.19.3.alpine.tar root@192.168.198.106:/data/
scp nginx.1.19.3.alpine.tar root@192.168.198.107:/data/
所有节点执行如下命令:
cd /data
docker load -i nginx.1.18.tar
docker load -i nginx.1.19.3.alpine.tar
rm -rf *
部署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-01
使用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
删除服务
docker service rm nginx
docker network rm nginx-net
stack命令
命令总结,如下图:
image.png
部署nginx
docker-compose.yml
version: "3"
services:
nginx-web:
image: nginx:1.19.3-alpine
container_name: nginx
networks:
- nginx-net
restart: always
ports:
- 80:80
deploy:
replicas: 5
networks:
nginx-net:
driver: overlay
运行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部署时会默认创建网络。如果我们定义网络。在dockerstack deploy时会先默认创建一个网络,在创建一个我们定义的网络。
一定要把镜像先拉取到本地再执行
Docker Stack和Docker Compose区别
- 1)Docker stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。 所以docker-compose更适合于开发场景;
- 2)Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。所以需要安装Docker -compose,以便与Docker一起在您的计算机上使用;
- 3)Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。
- 4)Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
- 5)docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。
它使用Docker API规范来操作容器。所以需要安装Docker -compose,以便与Docker一起在您的计算机上使用;
- 3)Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。
- 4)Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
- 5)docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。