运维实战 容器部分 Docker Swarm

  • 简介
  • 优点
  • 相关概念
  • 操作实践
  • 高速扩容/弹性收缩
  • 滚动更新
  • Portainer可视化管理


简介

  • SwarmDocker 1.12 版本之前属于一个独立的项目, 在 Docker 1.12 版本发布之后, 该项目合并到了 Docker 中, 成为 Docker 的一个子命令.
  • SwarmDocker社区提供的唯一一个原生支持 Docker 集群管理的工具.
  • Swarm可以把多个 Docker主机组成的系统转换为单一的虚拟 Docker主机, 使得容器可以组成跨主机的子网网络.
  • Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具.

优点

  • 任何规模都有高性能表现
  • 灵活的容器调度
  • 服务的持续可用性
  • Docker API及整合支持的兼容性
  • Docker SwarmDocker化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持.

相关概念

  • 节点分为管理 (manager) 节点和工作 (worker) 节点
  • 任务 (Task) 是 Swarm 中的最小的调度单位, 目前来说就是一个单一的容器.
  • 服务 (Services) 是指一组任务的集合, 服务定义了任务的属性.

容器运维项目_7z

操作实践

尝试使用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

容器运维项目_docker_02

##创建一个覆盖网络,保证在不同主机上的容器能够互通
[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监控可以看到服务的运行情况

容器运维项目_容器运维项目_03

高速扩容/弹性收缩

##开启服务后高速扩容或弹性收缩
##这里扩容到了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

容器运维项目_7z_04

滚动更新

具体参数

  • --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

容器运维项目_docker_05

容器运维项目_7z_06

进行环境清洁

[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可视化管理

容器运维项目_7z_07

安装部署

[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

容器运维项目_容器运维项目_08