docker swarm init
,将本机节点由单引擎模式切换为swarm集群模式。
Docker提供了一个用于与Docker守护进程进行交互的API(称为Docker Engine API),以及Go和Python的SDK。 使用SDK,您可以快速轻松地构建和扩展Docker应用程序和解决方案。 如果Go或Python不适用于您,则可以直接使用Docker Engine API。
在Docker生态系统中一共有3种API,这三种API都是依照REST标准:
Registry API:提供了与来存储Docker镜像的Docker Registry集成的功能。
Docker Hub API:提供了与Docker HUB集成的功能
Docker Remote API:提供与Docker守护进程进行集成的功能
Docker Swarm API主要是兼容Docker Remote API。Swarm API和Docker Engine API之间的还是有些区别的
Swarm是Docker公司在2014年12月初新发布的容器管理工具。和Swarm一起发布的Docker管理工具还有Machine以及Compose。
Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,并且还处于一个Alpha版本,目前在github上发布的版本 仅有v0.1.0-rc1。然而Swarm的发展十分快速,功能和特性的变更迭代还非常频繁。因此,可以说Swarm还不推荐被用于生产环境中,但可以肯 定的是Swarm是一项很有前途的技术。
Swarm 安全机制:集群内置有繁多的安全机制,提供了开箱即用的合理的默认配置——如 CA 设置、接入 Token、公用 TLS、加密集群存储、加密网络、加密节点 ID 等。
swarm架构
swarm 集群相关概念:
节点:【node】:管理节点(manager)和工作节点(worker)构成 mananger:管理节点(manager)负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。同时负责接收来自docker client的命令反馈至woker中进行运行,同时负责节点与仓库进行镜像拉取,使用Docker swarm API进行交互,并且在创建集群时,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群 Discovery 模块:Swarm发现Docker集群中的节点。discovery是Swarm中用于维护Docker集群状态的机制。既然涉及到 发现节点(但是在发现之前必须先有注册(register))。Swarm中有专门负责发现(discovery)的模块,而关于注册 (register)部分,不同的discovery模式下,注册(register)也会有不同的形式。目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery Scheduler 模块:Swarm内部的调度模块,在被初始化后面,swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node Swarm API模块:Swarm创建并初始化API监听服务模块后。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区 别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求 worker:工作节点,即图中的swarm node,负责使用docker守护进程管理多个容器,负责运行相应的服务来执行任务(task)。 任务:【task】是swarm集群中的最小调度单位,在swarm集群中就是一个单一容器。 服务:【service】,是一组任务的集合,定义了任务的属性 服务模式:复制(replicated) 和 全局(global) replicated:复制模式,是服务的默认模式,这种模式会部署期望数量(Replicas参数)的服务副本,并尽可能均匀地将各个副本分布在整个集群中 global:全局模式,在这种模式下,每个节点上仅运行一个副本 服务特性:扩容,缩容,针对的是复制模式下,部署数量的增多和减少 服务其他功能:升级镜像与回滚镜像swarm 流程:
初始化 Swarm第一个管理节点 -> 加入额外的管理节点 -> 加入工作节点 -> 完成swarm 管理节点高可用:
swarm内置HA:Swarm 实现了一种主从方式的多管理节点的 HA。管理节点可能有多个,但是仅有一个节点处于活动状态 Raft 算法:Swarm 使用了 Raft 共识算法的一种具体实现来支持管理节点的HA,部署管理节点应为奇数个,防止脑裂现象,同时建议不要部署太多管理节点(3-5为最佳) 主节点:【leader】:通常处于活动状态的管理节点被称为“主节点”(leader),而主节点也是唯一一个会对 Swarm 发送控制命令的节点。也就是说,只有主节点才会变更配置,或发送任务到工作节点 从节点:【follower】通常处于非活动状态的管理节点被称为“从节点”(follower),如果一个备用(非活动)管理节点接收到了 Swarm 命令,则它会将其转发给主节点 实践 实践环境主机 | IP | 作用 |
---|---|---|
node1 | 192.168.27.11 | 安装有Docker(18.09.6) |
node2 | 192.168.27.12 | 安装有Docker(18.09.6) |
node3 | 192.168.27.13 | 安装有Docker(18.09.6) |
通过swarm实现一个集群,拉伸,缩减节点,更新服务内容,并且在主控节点安装一个图像监控visualizer容器
实践过程 部署集群 由于本次实践,没有配置仓库,无法下载镜像,所以提前在node1、node2、node3中安装镜像ngnix,game2048,在node1中安装visualizer[root@node1 images]# docker load -i ngnix.tar
[root@node1 images]# docker load -i game2048.tar
[root@node1 images]# docker load -i visualizer.tar
[root@node2 images]# docker load -i ngnix.tar
[root@node2 images]# docker load -i game2048.tar
[root@node3 images]# docker load -i ngnix.tar
[root@node3 images]# docker load -i game2048.tar
swarm配置集群
创建集群,node1为manager身份
[root@node1 ~]# docker swarm init
Swarm initialized: current node (v4xx2txjkdysv6ke783820tcd) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
#以woork身份加入集群的命令,在其他需要加入集群的节点执行此命即可
To add a manager to this swarm, run 'docker swarm join-token manager' andfollow the instructions.
#开启swarm集群,node1为管理节点,上面提示中给出了join woker的方式,如果要以manager身份加入集群,查看join-token,命令docker swarm join-token manager
node2与node3节点加入集群,以worker身份
[root@node2 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
This node joined a swarm as a worker.
[root@node3 ~]# docker swarm join --token SWMTKN-1-15suzdeu07c9l6uf0pk2up7a3j21evjlnczrg4t6bqekscvccn-4y9np7dcdmrjtklsybyc2zjsm 192.168.27.11:2377
This node joined a swarm as a worker.
查看集群信息
[root@node1 images]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
v4xx2txjkdysv6ke783820tcd * node1 Ready Active Leader 18.09.6
mv238rores67ue8bc3nocfb6h node2 Ready Active 18.09.6
iiu8b0tw4bzsf848smjrc7r6c node3 Ready Active 18.09.6
swarm配置服务
[root@node1 images]# docker service create -p 80:80 --replicas 3 --name web_cluster nginx
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
#因为没有使用仓库,报错提示,不影响试验
sb8uuq2ekxghlv8qzlg5csm0j
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
#服务建立过程
[root@node1 images]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
sb8uuq2ekxgh web_cluster replicated 3/3 nginx:latest *:80->80/tcp
#查服务是否建立
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
xa75noxnlsqt web_cluster.2 nginx:latest node1 Running Running 42 seconds ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 44 seconds ago
#查看建立的服务web_cluster,中具体的task任务分布情况
修改各节点容器ngnix的访问页面,进行测试[root@node1 images]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
f0870e291b8c nginx:latest "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 80/tcp
#查看容器ID
[root@node1 images]# echo node1 > index.html
[root@node1 images]# docker cp index.html
f0870e291b8c :/usr/share/nginx/html/index.html
#修改index内容
[root@node2 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
999072a92b00 nginx:latest "nginx -g 'daemon of…" 15 minutes ago Up 14 minutes 80/tcp
#查看容器ID
[root@node2 opt]# echo node2 > index.html
[root@node2 opt]# docker cp index.html 999072a92b00:/usr/share/nginx/html/index.html
#修改index内容
[root@node3 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
a0be23d3551a nginx:latest "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 80/tcpluster.1.qz72v7tujl8r11dzebb7i0ccc
#查看容器ID
[root@node3 opt]# echo node3 > index.html
[root@node3 opt]# docker cp index.html a0be23d3551a:/usr/share/nginx/html/index.html
#修改index内容
进行测试,因为swarm是分布式的,访问任意几点,均可以实现web功能,所以分别针对node1、node2、node3的地址进行访问
[root@node1 images]# for i in {1..10};do curl 192.168.27.11;done
node2
node3
node1
node2
node3
node1
node2
node3
node1
node2
[root@node1 images]# for i in {1..10};do curl 192.168.27.12;done
node3
node1
node2
node3
node1
node2
node3
node1
node2
node3
[root@node1 images]# for i in {1..10};do curl 192.168.27.13;done
node1
node2
node3
node1
node2
node3
node1
node2
node3
node1
集群的容器的数量拉伸、缩减
[root@node1 images]# docker service scale web_cluster=6
web_cluster scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
x9jpdjbdq5r7 web_cluster.2 nginx:latest node1 Running Running 10 minutes ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 13 minutes ago
u1j1romoes7c web_cluster.4 nginx:latest node1 Running Running 8seconds ago
jy78pio77yoe web_cluster.5 nginx:latest node3 Running Running less than a second ago
1rpve5ncf7l9 web_cluster.6 nginx:latest node2 Running Running 9seconds ago
[root@node1 images]# docker service scale web_cluster=4
web_cluster scaled to 4
overall progress: 4 out of 4 tasks
1/4: running
2/4: running
3/4: running
4/4: running
verify: Service converged
[root@node1 images]# docker service ps web_cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qz72v7tujl8r web_cluster.1 nginx:latest node3 Running Running less than a second ago
x9jpdjbdq5r7 web_cluster.2 nginx:latest node1 Running Running 12 minutes ago
ytdr9mg6nu5n web_cluster.3 nginx:latest node2 Running Running 14 minutes ago
u1j1romoes7c web_cluster.4 nginx:latest node1 Running Running about a minute ago
安装图形化容器visualizer
根据官网指示,下载安装包,根据给定代码安装服务
[root@node1 images]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.nager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
image dockersamples/visualizer:latest could not be accessed on a registry to record
its digest. Each node will access dockersamples/visualizer:latest independently,
possibly leading to different nodes running different
versions of the image.
uusdr62myrnopa7zf44io3obp
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
[root@node1 images]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
uusdr62myrno viz replicated 1/1 dockersamples/visualizer:latest *:8080->8080/tcp
sb8uuq2ekxgh web_cluster replicated 9/9 nginx:latest *:80->80/tcp
#服务显示,viz创建
[root@node1 images]# docker service ps viz
ID NAME IMAGE NODE DESIRED CURRENT STATE ERROR PORTS
bupr51oo05yn viz.1 dockersamples/visualizer:latest node1 Running Running 2 minutes ago
#服务具体任务
开启了9个容器,显示效果如下[root@node1 images]# docker service update --image game2048 --update-delay 5s --update-parallelism 5 web_cluster
#docker service update 更新命令
#--image 更新镜像
#--update-parallelism 5 每次更新容器并行运行的数量,本次设置为5个,也就是每一批更新5个
#--update-delay 5s 每批次更新容器之间的时间间隔,本次设置为5秒
image game2048:latest could not be accessed on a registry to record
its digest. Each node will access game2048:latest independently,
possibly leading to different nodes running different
versions of the image.
web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged
图像显示更新完成[root@node1 images]# docker service update --image nginx --rollback-parallelism 3 --rollback-delay 2s web_cluster
#docker service update 回滚也属于更新命令下的选项
#--rollback-parallelism 每一批回滚容器的个数,与更新一样
#--rollback-delay 每批次回滚容器之间的时间间隔,与更新一样
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
web_cluster
overall progress: 9 out of 9 tasks
1/9: running
2/9: running
3/9: running
4/9: running
5/9: running
6/9: running
7/9: running
8/9: running
9/9: running
verify: Service converged
回滚成功显示