文章目录
1、Docker Swarm简介
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
这个图作为一个整体实际上都处于一个所谓的集群中,它可能对应了一到多台的实际服务器。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能笼统地向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是Swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。
2、Docker Swarm相关概念
节点
运行 Docker 的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行 Docker 的主机就成为一个 Swarm集群的节点(node)。
节点分为管理(manager)节点和工作(worker)节点。
管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。
工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
服务和任务
任务(Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器。
服务(Services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过docker service create的–mode参数指定。
来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。
3、Docker Swarm 实践
3.1 Docker Swarm 的安装
docker swarm init #初始化,然后可以看到提示
docker swarm join --token \
SWMTKN-1-32axwyv0mqh43epu7igmmk2n00kxxnztm17f8vouy56sdh3gsc-74epd17ja8kbf4rrd2jjawmq3 \
1.2.3.1:2377
3.2 Docker Swarm 小试
对为三台同样操作,因为还没有搭建私有仓库,必须先把镜像准备好。
docker service create --name my_cluster --replicas 2 -p 80:80 myapp:v1
3.3 为swarm搭建webUI监控节点系统,一目了然
docker pull dockersamples/visualizer #拉取监控镜像
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
浏览器访问,实时监控,非常直观:
3.4 弹性增减容器,简直不要太方便
docker service scale my_cluster=20
4、给Swarm增加私有仓库
4.1 增加server4新节点,并安装docker-ce
这里不懂可以看Linux下KVM虚拟化自动部署
照快照
配置静态IP
安装docker-ce,这里利用前面学习的docker-machineDocker三剑客之Machine
1)配置免密
2)一条命令搞定
4.2 将swarm master由server1迁移到server2上
将server2提升为备用
将server1降级
server2备胎上位
将server4加入Swarm
docker swarm join --token SWMTKN-1-194h0jzb90smccawgpl45hgibqvt6vhs66m5rrcamovb9if8wb-avfie95xt1ym0jsqcz262325c 1.2.3.2:2377
systemctl reload docker.service #server2\3\4 全部重新加载下docker服务
4.3 将之前server1上配置的harbor仓库启用
将server1退出swarm并在master端删除server1节点
配置仓库
把需要的镜像上传进去:
4.4 测试
配置加速器:
systemctl reload docker.service #server2\3\4 全部重新加载下docker服务
传送证书
关闭my_cluster,并清理所有节点的镜像,保证实验的镜像是在私有仓库拉取的
像之前那样执行命令
5、滚动更新
docker service update \
--image myapp:v2 \ #指定要更新的镜像
--update-parallelism 2 \ #指定最大同步任务数
--update-delay 5s my_web \ # 指定更新间隔
上传myapp:v2到私有仓库
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s my_web