赞
踩
节点名称IP操作系统内核版本
注意:部署这些编排工具的时候服务器数量不定,1台服务器也行,所以读者可以自由增减服务器。
Docker
版本1.18+TCP 2377
、TCP/UDP 7946
和UDP 4789
端口通信注意:Docker
版本最好大于1.12
,因为1.12
版本之后Docker Swarm
才正式归入Docker
内置命令内,另外,需要保证各个节点之间的可连通性,如果是外网集群的话,注意要设置iptable
来限定某些IP
对于某些端口的可访问性。
- [root@master ~]# docker swarm init --advertise-addr 172.16.60.95
- Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager.
-
- To add a worker to this swarm, run the following command:
-
- docker swarm join --token SWMTKN-1-3fzyAz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
-
- To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意:真的是一键部署集群!!!,上面命令执行后,该机器自动加入到swarm集群
。这个会创建一个集群token
,获取全球唯一的 token
,作为集群唯一标识。后续将其他节点加入集群都会用到这个token
值。 其中,--advertise-addr
参数表示其它swarm
中的worker
节点使用此ip地址
与manager
联系。命令的输出包含了其它节点如何加入集群的命令。
使用docker info
或者 docker node ls
查看集群中的相关信息
- docker info
-
- .......
- Swarm: active
- NodeID: kfi2r4dw6895z5yvhlbyzfck6
- Is Manager: true
- ClusterID: y2zgs373cg0y6559t675yexcj
- Managers: 1
- Nodes: 1
- Orchestration:
- Task History Retention Limit: 5
- .......
需要在所有节点执行,worker节点
只需一条命令就可以加入集群
docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
在master
上查看集群节点
的状态
到此Swarm集群
就创建好了,我们现在有一个多节点的Swarm集群
,我们来测试一下常用的命令吧~~~
- [root@master ~]# docker node --help
-
- Usage: docker node COMMAND
-
- Manage Swarm nodes
-
- Options:
-
-
- Commands:
- demote Demote one or more nodes from manager in the swarm
- inspect Display detailed information on one or more nodes
- ls List nodes in the swarm
- promote Promote one or more nodes to manager in the swarm
- ps List tasks running on one or more nodes, defaults to current node
- rm Remove one or more nodes from the swarm
- update Update a node
-
-
- # demote
- 将管理节点降级为普通节点
- # inspect
- 查看节点的详细信息
- # ls
- 列出节点
- # promote
- 将普通节点升级为管理节点
- # ps
- 查看运行的任务
- # rm
- 从swarm集群中删除节点
- # update
- 改变集群节点状态
- [root@master ~]# docker node update --help
-
- Usage: docker node update [OPTIONS] NODE
-
- Update a node
-
- Options:
- --availability string Availability of the node ("active"|"pause"|"drain")
- --label-add list Add or update a node label (key=value)
- --label-rm list Remove a node label if exists
- --role string Role of the node ("worker"|"manager")
-
-
- # 主要使用availability string
-
- # active
- 节点状态正常
- # pause
- 节点挂起、暂停
- # drain
- 排除节点,比如将master节点排除,不分配任务,只作为管理节点
-
-
- node update命令
集群部署好了,我们接下来该测试一下我们的集群基本使用是否正常,下面我们开始我们的测试。
- [root@master ~]# docker service create --replicas 1 --name hello busybox
- [root@master ~]# docker service ls
- ID NAME MODE REPLICAS IMAGE PORTS
- kosznwn4ombx hello replicated 0/1 busybox:latest
从REPLICAS
中能看出这个 hello服务
并没有启动起来,0/1
表示 1
计划启动的副本数,0
实际启动的数量。所以启动失败
在hello服务
中busybox
只是一个基础镜像,并没有一个持续运行的任务,所以manager
会不断重启hello
这个服务,所以有好多shutdown
的记录。但是我们可以为其添加一个任务使其持续运行。注意:为什么没有任务Docker
容器就会终止呢?这个问题我们之后再回答
- [root@master ~]# docker service update --args "ping www.baidu.com" hello
- hello
- overall progress: 1 out of 1 tasks
- 1/1: running [==================================================>]
- verify: Service converged
-
-
- # update:更新状态
-
- # --args:增加参数
再次查看hello服务
状态:
过滤不正常的hello服务
状态:
- [root@master ~]# docker service ps -f "desired-state=running" hello
- ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
- yxyivio4mzlg hello.1 busybox:latest master Running Running 4 minutes ago
-
-
- # -f "desired-state=running" : 状态为runngin的服务
刚才设置的replicas=1
,可以增加副本数量
- [root@master ~]# docker service scale hello=4
-
- hello 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
-
-
- # scale : 指定服务的数量
manager
,manager
只作为管理节点上图中manager
也运行了一个服务,将manager
排除在外,在正式的生产环境中我们都建议这么做,因为在容器编排当中,区分Worker
和Master
节点的主要原因是因为Worker
只负责完成任务,启动服务,而Master
则负责任务的调配,一旦Master
节点也运行服务,导致Master
节点负载过重,则会使集群发生崩溃,所以工作节点排除manager
是很有必要的。
- [root@manager ~]# docker node update --availability drain manager
-
- # node update : 更改节点状态
-
- # --availability : 三种状态
-
- active: 正常
- pause:挂起
- drain:排除
排除manager
后,其上面运行的服务会转移到其他节点
四、滚动更新服务
例如升级服务
的镜像版本
- [root@manager ~]# docker service create
- > --replicas 3
- > --name redis
- > --update-delay 10s
- > redis:3.0.6
-
-
- # 启动3个副本集的redis
-
- # update-delay 10s :每个容器依次更新,间隔10s
滚动更新:
docker service update --image redis:3.0.7 redis
更新完成后新版本和历史记录都能查看
查看配置信息:
五、服务更新和回滚策略
- [root@manager ~]# docker service create
- --name my-web
- --replicas 10
- --update-delay 10s
- --update-parallelism 2
- --update-failure-action continue
- --rollback-parallelism 2
- --rollback-monitor 20s
- --rollback-max-failure-ratio 0.2
- nginx:1.12.1
-
-
- # --update-parallelism 2 : 每次允许两个服务一起更新
-
- #--update-failure-action continue : 更新失败后的动作是继续
-
- # --rollback-parallelism 2 : 回滚时允许两个一起
-
- # --rollback-monitor 20s :回滚监控时间20s
-
- # --rollback-max-failure-ratio 0.2 : 回滚失败率20%
如果执行后查看状态不是设置的,可以在update
一下,将服务状态设置为自己想要的
- docker service update --rollback-monitor 20s my-web
-
- docker service update --rollback-max-failure-ratio 0.2 my-web
-
- # 有两个地方设置数值没有成功,手动设置
查看状态:
[root@manager ~]# docker service update --image nginx:1.13.5 my-web
和上述策略一致,两两更新
更新完成:
刚才nginx版本已经是1.13.5
了,现在将其还原到1.12.1
[root@manager ~]# docker service update --rollback my-web
手动回滚成功
我们既然搭建好了我们的容器编排集群,那我们总不能日常的时候也在命令行进行操作,所以我们需要使用到一些可视化的工具,Docker
图形化管理提供了很多工具,有Portainer
、Docker UI
、Shipyard
等等,本文主要介绍Portainer
。
Portainer
是一个开源、轻量级Docker
管理用户界面,基于Docker API
,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群
和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
- [root@ linuxidc /]# docker pull portainer/portainer
- Using default tag: latest
- latest: Pulling from portainer/portainer
- d1e017099d17: Pull complete
- ba5495c717cb: Pull complete
- Digest: sha256:8146a5aae1135a0ccee424488c6867b438be21d1e915903a858d12e8382b817b
- Status: Downloaded newer image for portainer/portainer:latest
如果仅有一个docker宿主机
,则可使用单机版
运行,Portainer单机版
运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker
镜像、容器等数据。
创建数据卷:
- [root@linuxidc ~]# docker volume create portainer_data
- portainer_data
注意:很多人会有疑问,为什么要创建数据卷?这个我们也在之后进行回答,这里埋下一坑。
运行容器:
- [root@linuxidc ~]# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
- 439cc8a6d44a84f5967534c50d3accc43fbeb578258a52c2683afeb230dd6e04
-
- 参数说明:
- -d:容器在后台运行;
- -p 9000:9000 :宿主机9000端口映射容器中的9000端口
- -v /var/run/docker.sock:/var/run/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中;
- -v portainer_data:/data :把宿主机portainer_data数据卷挂载到容器/data目录;
查看容器进程:
- [root@linuxidc ~]# docker ps -l
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 439cc8a6d44a portainer/portainer "/portainer" 13 seconds ago Up 13 seconds 0.0.0.0:9000->9000/tcp amazing_clarke
访问服务:
访问方式:http://IP:9000 ,首次登录需要注册用户,给用户admin
设置密码,如下图:
单机版本选择“Local"
,点击Connect
即可连接到本地docker
,如下图:
注意:从上图可以看出,有提示需要挂载本地/var/run/docker.socker
与容器内的/var/run/docker.socker
连接。因此,在启动时必须指定该挂载文件。
更多的情况下,我们会有一个docker集群
,可能有几台机器
,也可能有几十台机器
,因此,进行集群管理就十分重要了,Portainer
也支持集群管理,Portainer
可以和Swarm
一起来进行集群管理操作。首先要搭建了一个Swarm
,本文不着重介绍Swarm集群
的安装。
启动集群参考官方文档:https://portainer.io/install.html
- $ docker service create
- --name portainer
- --publish 9000:9000
- --replicas=1
- --constraint 'node.role == manager'
- --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock
- --mount type=bind,src=//opt/portainer,dst=/data
- portainer/portainer
- -H unix:///var/run/docker.sock
启动Portainer
之后,首页还是给admin
用户设置密码(这里和单机启动一样)。
我们进入之后可以看到这个一个界面。
我们可以看到我们现在的集群的节点配置情况
我们可以看到我们集群中各节点的容器分布情况
我们现在已经做好了集群以及集群的可视化管理,我们可以将自己的服务打包到DockerHub
仓库进行发布,但有时候我们希望有个自己的私人仓库,能够不对外暴露的话,怎么办呢?我们这里介绍一种方式,基于Docker Swarm+阿里云镜像仓库
的服务部署方式。
根据链接进入到镜像仓库
新建镜像仓库
我们选择从命令行推镜像
新建好“test”镜像仓库,看看具体的仓库情况
我们拉下来一个镜像,记住镜像的 ID
我们先在本地登录仓库,便于之后的操作
将本地的镜像打上TAG
,推到远程仓库
我们切换到远程仓库,test镜像仓库
已经有了该镜像,说明我们推送成功了。
Portainer
添加私有库Portainer
拉取远程仓库启动一个容器启动容器
测试容器是否正常运行
根据Postman
的信息,服务正常运行,说明我们这个思路是正确的~
单就目前的云市场来说,Kubernates
已经占据80%
的市场份额,Docker Swarm
已逐渐被淘汰,像阿里云将会在不久之后终止对Swarm
的云编排的支持。虽然是这样的请况,但是对于我们个人开发者来说,也许我们的服务器配置很低,但我们又想用云平台来部署自己的服务,那我们大可以选择Docker Swarm
,简单又不需要极高的配置,还能让我们尝试云服务带给我们的便捷性,何乐而不为呢?
号主介绍
前两年在二线大厂工作,目前在创业公司搬砖。
接触方向是爬虫和云原生架构方面,
有丰富的反爬攻克经验以及云原生二次开发经验。
其他诸如数据分析、黑客增长也有所涉猎。
做过百余人的商业分享以及多次开办培训课程。
目前也是**CSDN博客专家 **
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。