运维实战 容器部分 Docker Swarm
- 简介
- 优点
- 相关概念
- 操作实践
- 高速扩容/弹性收缩
- 滚动更新
- Portainer可视化管理
简介
-
Swarm
在Docker 1.12
版本之前属于一个独立的项目, 在Docker 1.12
版本发布之后, 该项目合并到了Docker
中, 成为Docker
的一个子命令. -
Swarm
是Docker
社区提供的唯一一个原生支持 Docker 集群管理的工具. -
Swarm
可以把多个Docker
主机组成的系统转换为单一的虚拟Docker
主机, 使得容器可以组成跨主机的子网网络. -
Docker Swarm
是一个为 IT 运维团队提供集群和调度能力的编排工具.
优点
- 任何规模都有高性能表现
- 灵活的容器调度
- 服务的持续可用性
- 和
Docker API
及整合支持的兼容性 -
Docker Swarm
为Docker化应用
的核心功能(诸如多主机网络和存储卷管理)提供原生支持.
相关概念
- 节点分为管理 (manager) 节点和工作 (worker) 节点
- 任务 (Task) 是
Swarm
中的最小的调度单位, 目前来说就是一个单一的容器. - 服务 (Services) 是指一组任务的集合, 服务定义了任务的属性.
操作实践
尝试使用Swam搭建一个简单的Docker集群
##初始化集群
[root@Server2 mnt]# docker swarm init
Swarm initialized: current node (o4r10ds4bxw3y8z8y84ufhcy0) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-02ehvyproa9tuw7zoev5nq6744kskjpatc957xue3bznq0xhat-0yi4crvg6i3dutev7zo1z7few 172.25.5.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
可以看到上方出现了操作的提示
- 执行初始化的主机默认为管理节点
- 在其他主机上执行
docker swarm join --token SWMTKN-1-02ehvyproa9tuw7zoev5nq6744kskjpatc957xue3bznq0xhat-0yi4crvg6i3dutev7zo1z7few 172.25.5.2:2377
即可作为工作节点加入集群
##查看swarm集群中的节点
[root@Server2 mnt]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
o4r10ds4bxw3y8z8y84ufhcy0 * Server2 Ready Active Leader 19.03.15
##加入集群
[root@Server4 docker-ce]# docker swarm join --token SWMTKN-1-02ehvyproa9tuw7zoev5nq6744kskjpatc957xue3bznq0xhat-0yi4crvg6i3dutev7zo1z7few 172.25.5.2:2377
This node joined a swarm as a worker.
##导入swarm监控需要的镜像
[root@Server2 mnt]# docker load -i visualizer.tar
5bef08742407: Loading layer 4.221MB/4.221MB
5f70bf18a086: Loading layer 1.024kB/1.024kB
0a19bde117a5: Loading layer 60.01MB/60.01MB
f7e883283ebc: Loading layer 3.942MB/3.942MB
dfd8ee95c7e7: Loading layer 1.536kB/1.536kB
300a6cad969a: Loading layer 8.704kB/8.704kB
d1627040da6d: Loading layer 489kB/489kB
00ed018016c5: Loading layer 2.56kB/2.56kB
d5aa1ab1b431: Loading layer 4.096kB/4.096kB
2d6a463420f7: Loading layer 4.608kB/4.608kB
53888d7f4cca: Loading layer 2.56kB/2.56kB
ea93ed99abca: Loading layer 2.598MB/2.598MB
fa467b43abc0: Loading layer 4.096kB/4.096kB
94cd25765710: Loading layer 96.48MB/96.48MB
Loaded image: dockersamples/visualizer:latest
##部署swarm监控
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
##创建一个覆盖网络,保证在不同主机上的容器能够互通
[root@Server2 ~]# docker network create -d overlay MyNet
##创建集群服务,这里使用了准备好的测试镜像MyAPP
[root@Server2 ~]# docker service create --replicas 3 --network MyNet --name MyApp -p 80:80 172.25.5.1/library/ikubernetes/myapp:v1
4l8ncqd0l0je0mx1ofvosy3as
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
##创建成功后可以看到运行情况
[root@Server2 portainer]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
4l8ncqd0l0je MyApp replicated 3/3 172.25.5.1/library/ikubernetes/myapp:v1 *:80->80/tcp
uabfzy52y3g9 viz replicated 1/1 172.25.5.1/library/dockersamples/visualizer:latest *:8080->8080/tcp
参数的含义
-
--replicas 3
: 部署3个副本 -
--network MyNet
: 采用MyNet自定义网络,这样才能确保各主机之间联通
通过Swarm
监控可以看到服务的运行情况
高速扩容/弹性收缩
##开启服务后高速扩容或弹性收缩
##这里扩容到了5个副本
[root@Server2 portainer]# docker service scale MyApp=5
MyApp scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
滚动更新
具体参数
-
--image
指定要更新的镜像 -
--update-parallelism
指定最大同步更新的任务数 -
--update-delay
指定更新间隔
##在不影响服务的前提下进行滚动更新
[root@Server2 portainer]# docker service update --image 172.25.5.1/library/ikubernetes/myapp:v2 --update-parallelism 2 --update-delay 5s MyApp
MyApp
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
进行环境清洁
[root@Server2 portainer]# docker service rm MyApp
MyApp
[root@Server2 portainer]# docker service rm viz
viz
[root@Server2 portainer]# docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
MyNet
Portainer可视化管理
安装部署
[root@Server2 mnt]# cd portainer/
[root@Server2 portainer]# ls
portainer-agent-stack.yml portainer-agent.tar portainer.tar
[root@Server2 portainer]# docker load -i portainer.tar
dd4969f97241: Loading layer 278kB/278kB
e7260fd2a5f2: Loading layer 73.85MB/73.85MB
Loaded image: portainer/portainer:latest
[root@Server2 portainer]# docker load -i portainer-agent.tar
1f0ac9aec537: Loading layer 2.048kB/2.048kB
0cf0d1d03535: Loading layer 12.15MB/12.15MB
Loaded image: portainer/agent:latest
[root@Server2 portainer]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
portainer/portainer latest 19d07168491a 2 years ago 74.1MB
portainer/agent latest 9335796fedf9 2 years ago 12.4MB
[root@Server2 portainer]# docker stack deploy Portainer -c portainer-agent-stack.yml
Creating network Portainer_agent_network
Creating service Portainer_agent
Creating service Portainer_portainer
[root@Server2 portainer]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
w827vetw7wrf Portainer_agent global 2/3 portainer/agent:latest
glam91u0efx9 Portainer_portainer replicated 0/1 portainer/portainer:latest *:9000->9000/tcp