docker swarm部署介绍
docker swarm一、基本概念二、swarm的部署一、基本概念Swarm是Docker引擎内置(原生)的集群管理和编排工具。Docker Swarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。Swarm mode内置kv存储
docker swarm
一、基本概念
Swarm是Docker引擎内置(原生)的集群管理和编排工具,是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。
Swarm mode内置kv存储功能,提供了众多的新特性。
比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得Docker原生的Swarm集群具备与Mesos、Kubernetes竞争的实力。使用Swarm集群之前需要了解以下几个概念。
node节点
Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点。节点分为管理(manager)节点和工作(worker)节点。
管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。
工作节点是任务执行节点,管理节点将服务下发至工作节点执行。管理节点默认也作为工作节点。也可以通过配置让服务只运行在管理节点。
环境准备
docker | docker2 | docker3 |
---|---|---|
192.168.229.187 | 192.168.229.40 | 192.168.229.50 |
关闭防火墙、禁用selinux、3台dockerhost区别主机名、时间同步。
docker版本必须是:v1.12版本开始;
Swarm:作用运行docker engine的多个主机组成的集群;
node:每一个docker engine都是一个node,分为manager和worker;
manager node:
负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。
worker node:
接受并执行由manager node派发的任务,并且默认manager node也是一个worker node,不过可以将它设置为manager-only node,让它只负责编排和管理工作。
service:
用来定义worker上执行的命令。
二、swarm的部署
1.初始化集群
[root@docker ~]# docker swarm init --advertise-addr 192.168.229.187
Swarm initialized: current node (hcvxhgp8bmzjj2ip0uov0amgc) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
–advertise-addr:指定与其他node通信的地址。
初始化成功,如果想要添加worker节点运行下面的命令:
docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
注意:token只有24小时的有效期。
如果想要添加manager节点,运行如下命令:
docker swarm join-token manager
接下来把docker2和docker3以worker的身份加入到集群中。
[root@docker2 ~]# docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
This node joined a swarm as a worker.
[root@docker3 ~]# docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
This node joined a swarm as a worker.
当其他两个节点加入成功后,可以执行docker node ls查看节点详情。
[root@docker ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hcvxhgp8bmzjj2ip0uov0amgc * docker Ready Active Leader 18.09.0
4419pe146yj7nxjtltajqy65e docker2 Ready Active 18.09.0
jbgferutnebq81tpadopkrk56 docker3 Ready Active 18.09.0
基本操作命令
docker swarm leave:申请离开一个集群,查看节点状态会变成down,然后可以通过manager node将其删除;
docker node rm xxx:删除某个状态为down的节点;
docker swarm join-token [manager | worker]:生成令牌,可以是manager身份或worker身份;
docker node demote(降级):将swarm节点的manager降级为worker;
docker node promote(升级):将swarm节点的worker升级为manager;
docker node update --availability ("active"|"pause"|"drain");
通过设置节点的状态,让manager节点不参加实际的运行容器的任务;
2.部署docker swarm网络
overlay:覆盖型网络
[root@docker ~]# docker network create -d overlay --attachable docker
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ba039c97d5ef bridge bridge local
imhd6gg3587a docker overlay swarm
f72f1e6808e7 docker_gwbridge bridge local
21f1bb57b242 host host local
mvcfw3lyjbvm ingress overlay swarm
655be92264b0 none null local
attachable:这个参数必须要加,否则不能用于容器。在创建网络时,并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。并且在docker上创建的此网络,在swarm的其他节点是查看不到此网络信息的,但却能够直接使用此网络。
3.部署一个图形化web ui界面
[root@docker ~]# docker run -d -p 8080:8080 -e HOST=192.168.229.187 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
然后访问浏览器验证
192.168.229.187:8080
如果访问不到网页,需要开启路由转发。
[root@docker ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker ~]# sysctl -p
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
4.创建serveice
[root@docker ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx
replicas:期望的副本数量,可以理解为一个副本等于一个容器。
(1)查看service
[root@docker ~]# docker service ls
(2)查看service详细信息
[root@docker ~]# docker service ps xxx
(3)设置manager node不参加工作
[root@docker ~]# docker node update docker --availability drain
5.搭建私有仓库
(1)docker容器运行registry私有仓库服务
下载需要的镜像
[root@docker ~]# docker pull registry:2
(2)运行私有仓库服务
[root@docker ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
(3)镜像重命名
因为使用的私有镜像,在上传或下载时都需要将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。
格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
[root@docker ~]# docker tag httpd:latest 192.168.229.187:5000/httpd:v1
(4)编辑docker配置文件
docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口,这是因为Docker默认不允许非HTTPS方式推送镜像。如果没做这一步,会报HTTPS的错。
编辑docker的配置文件,指定私有仓库地址。
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.187:5000
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker.service
(5)上传私有仓库
[root@docker ~]# docker push 192.168.229.187:5000/httpd:v1
注意:既然是私有仓库,肯定是要考虑多台DockerHost共用的情况,如果有其他的DockerHost想要使用私有仓库,需要修改docker的配置文件,指定私有仓库的IP和端口。
6.自定义镜像
要求:基于httpd镜像,更改主访问界面内容。镜像tag版本为v1、v2、v3,对应主机面内容为111、222、333。
7.基于上述镜像发布服务
副本数量为3个,服务的名称为:snow
[root@docker ~]# docker service create --replicas 3 --name snow -p 80:80 192.168.229.187:5000/httpd:v1
默认的Ingress网络,包括创建的自定义overlay网络,为后端真正为用户提供服务的container,提供了一个统一的入口。
8.服务的扩容与缩容
[root@docker ~]# docker service scale snow=6
扩容与缩容直接通过scale进行设置副本数量。
9.服务的升级与回滚
[root@docker ~]# docker service update --image 192.168.229.187:5000/httpd:v2 snow
平滑更新
[root@docker ~]# docker service update --image 192.168.229.187:5000/httpd:v3 --update-parallelism 2 --update-delay 1m snow
注意:默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等待时间。
--update-parallelism:设置并行更新的副本数量;
--update-delay:指定滚动更新的时间间隔;
回滚操作
[root@docker ~]# docker service rollback snow
注意:docker swarm的回滚操作,默认只能回滚到上一次操作的状态,并不能连续回滚操作。
10.指定容器运行节点
[root@docker ~]# docker node update --help
--label-add list Add or update a node label (key=value)
给节点添加标签。
给docker2上添加一个标签(磁盘容量最大)
[root@docker ~]# docker node update --label-add disk=max docker2
查看标签信息
[root@docker ~]# docker node inspect docker2
"UpdatedAt": "2019-10-30T02:46:41.874901441Z",
"Spec": {
"Labels": {
"disk": "max"
...
删除标签
[root@docker ~]# docker node update --label-rm disk docker2
运行服务,指定节点
[root@docker ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
[root@docker ~]# docker service ls
[root@docker ~]# docker service ps test
更多推荐
所有评论(0)