如何安装docker,参阅 docker centos7上的安装
现在系统架构强调的是高可用,显然单机版的docker只能玩玩,无法胜任生产任务。那么docker怎么 进行集群呢?
使用Swarm
从docker入门到实践一书中找点swarm相关概念:
Swarm 是使用 SwarmKit 构建的 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 官网的这张图片形象的展示了容器、任务、服务的关系。
-------------------准备-------------
环境:
docker版本:18.09.6
操作系统:centos7 64位
操作系统权限:root
三台装有docker的服务器:192.168.157.134(管理节点)、 192.168.157.131(工作节点)、 192.168.157.132(工作节点)
-------------------创建Swarm集群-------------
1. 确保所有服务器上的docker均已启动,如未启动,在root权限下用如下命令启动
systemctl start docker
2. 初始化swarm集群,创建主节点,服务器ip地址为192.168.157.134。为了便于初始化swarm前后进行对比,在执行初始化命令docker swarm init之前,用docker info命令查看swarm的相关信息。下图中信息显示swarm未被启用
下面来执行如下命令进行swarm初始化
$ docker swarm init
Swarm initialized: current node (jmlk4z4np9pzd9m2yg5s6t6tt) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上面的信息也告诉如何进行工作节点的增加: docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377
上述token一定要保存好,以后增加节点要用的!!!!
如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。如:docker swarm init --advertise-addr 192.168.99.100
执行 docker swarm init 命令的节点自动成为管理节点。
下面再用docker info命令查看docker swarm状态,显示了swarm处于启用状态,当前服务器为管理节点,仅有1个管理节点和工作节点
3. 添加工作节点(服务器ip地址192.168.157.131),执行如下命令
[root@bogon ~]# docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377
This node joined a swarm as a worker.
出现This node joined a swarm as a worker表明工作节点添加成功,在该工作节点服务器上使用docker info命令查看信息。
可以看到当前工作节点的服务器地址为:192.168.157.131,该节点不是管理节点,管理节点的地址为:192.168.157.134:2377
现在切换到管理节点192.168.157.134服务器上,运行docker info查看有什么变化,发现工作节点为2
用同样的方法将192.168.157.132也加到工作节点
4. 管理节点退出 Swarm 集群
如果 管理节点想要退出 Swarm 集群, 在 Manager Node 上执行如下命令:
docker swarm leave
就可以退出集群,如果集群中还存在其它的 Worker Node,还希望 Manager 退出集群,则加上一个强制选项,命令行如下所示:
docker swarm leave --force
至此swarm集群部署完毕,下面是docker swarm集群常用命令
-------------------Docker Swarm集群常用命令,这些命令只能运行在管理节点上-------------
接着上面的步骤进行
1. 查看集群节点。hostname相同时因为我本地的linux系统是通过虚拟软件克隆了三份
#该命令用于查询swarm集群工作节点,且命令必须在管理节点上运行
[root@bogon ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
jmlk4z4np9pzd9m2yg5s6t6tt * bogon Ready Active Leader 18.09.6
q35e63xnq55uy4zi4swrig4u5 bogon Ready Active 18.09.6
q5xzaozvi4a5vckn6mtaczmrm bogon Ready Active 18.09.6
#下面是docker node命令
[root@bogon ~]# docker node --help
Usage: docker node COMMAND
Manage Swarm nodes
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 列出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 从swarm集群中移除某个节点
update Update a node 更新某个节点
2. 部署服务。使用 docker service 命令来管理 Swarm 集群中的服务
#新建服务
[root@bogon ~]# docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
上述命令中,如果镜像nginx不存在,则会自动从docker仓库进行下载
--replicas 任务数量即服务运行的个数。本例子为3个
-p 设置节点端口。 本例子端口为80
--name 服务名称。本例子服务名称为nginx
nginx:1.13.7-alpine 为镜像。格式为:镜像名称:tag
如果想看create用法,可以使用命令 docker service create --help
接下来可以通过docker container ls命令,可以看到刚才的3台docker节点中都已启动了nginx容器
[root@bogon ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d64b2e77d09 nginx:1.13.7-alpine "nginx -g 'daemon of…" 28 minutes ago Up 28 minutes 80/tcp nginx.3.vtofowd9du942qn6547kdzbkn
#查看服务
#使用 docker service ls 来查看当前 Swarm 集群运行的服务。
#REPLICAS 3/3 前面的3表示运行中的服务数量,后面的3表示总的服务数量
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#使用 docker service ps 来查看某个服务的详情(如部署在哪个节点,服务状态,镜像等等),nginx为服务名称
[root@bogon ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vrr8jqjixy34 nginx.1 nginx:1.13.7-alpine bogon Running Running about an hour ago
cjdf4zf09n4z \_ nginx.1 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
s7v4xqx1f4jd \_ nginx.1 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
slydwoksuwye \_ nginx.1 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
728g11dbvwqh nginx.2 nginx:1.13.7-alpine bogon Running Running 43 minutes ago
6hzkwzofdl7i \_ nginx.2 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
h7d88zvj8du4 \_ nginx.2 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
vtofowd9du94 nginx.3 nginx:1.13.7-alpine bogon Running Running about an hour ago
qmn5hvrwtkh6 \_ nginx.3 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
ne0wrosgtmhy \_ nginx.3 nginx:1.13.7-alpine bogon Shutdown Rejected about an hour ago "No such image: nginx:1.13.7-a…"
[root@bogon ~]#
#查看正在运行的某个服务在每个节点的运行情况
[root@manager ~]# docker service ps -f "DESIRED-STATE=Running" nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
sk8xr6an4btt nginx.1 nginx:1.13.7-alpine node2 Running Running 13 minutes ago
f8oon9lvw09a nginx.2 nginx:1.13.7-alpine manager Running Running 14 minutes ago
to1tilzsomjb nginx.3 nginx:1.13.7-alpine node1 Running Running 13 minutes ago
849634w1moma nginx.4 nginx:1.13.7-alpine node2 Running Running 13 minutes ago
0t9sgrtd8kiy nginx.5 nginx:1.13.7-alpine manager Running Running 13 minutes ago
shz0rlutr8c3 nginx.6 nginx:1.13.7-alpine node1 Running Running 14 minutes ago
#使用 docker service logs 来查看某个服务的日志。nginx为服务名称
[root@bogon ~]# docker service logs nginx
#删除服务
#使用 docker service rm 来从 Swarm 集群移除某个服务。
#移除服务之前,先看下当前有什么服务
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rb529p6g55ya mongo replicated 1/2 mongo:latest
io27pypwapy4 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#删除mongo服务
[root@bogon ~]# docker service rm mongo
mongo
#再次查看服务,发现mongo已被删除
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
[root@bogon ~]#
#调整服务数量
docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
#本例子将原来nginx服务个数由3个调整为2个
#查看下原来的服务数
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#调整服务为2
[root@bogon ~]# docker service scale nginx=2
nginx scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
[root@bogon ~]#
#再次查看服务数
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 2/2 nginx:1.13.7-alpine *:80->80/tcp
[root@bogon ~]#
通过docker container ls在三台docker服务器上分别查看运行的容器发现有一台已经没有nginx服务了。
#接下来思考一下如果将服务副本数调整为5个,现在只有三台docker服务器,那么调整后会出现什么情况呢?
[root@bogon ~]# docker service scale nginx=5
nginx 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
[root@bogon ~]#
通过docker container ls 再次查看,发现有两台服务器上启动两个nginx服务,说明如果有三台docker服务器并且启动的服务数正好也是三个,则每个docker服务器分别分配一个服务
#停止集群中的服务
可以通过docker service scale nginx=0,将nginx服务个数设置为0
#停止之前,查看服务运行情况
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 5/5 nginx:1.13.7-alpine *:80->80/tcp
#开始停止服务
[root@bogon ~]# docker service scale nginx=0
nginx scaled to 0
overall progress: 0 out of 0 tasks
verify: Service converged
#再次查看服务运行情况,发现已经没有正在运行的服务了
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 0/0 nginx:1.13.7-alpine *:80->80/tcp
#通过docker container ls查看运行的docker容器,发现也没了
[root@bogon ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
当然也可以通过停止正在运行的容器来停止具体某个机器上的服务
docker stop 容器ID或容器名
#停止之前先看下服务运行状态
verify: Service converged
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 5/5 nginx:1.13.7-alpine *:80->80/tcp
#选择要停止服务的服务器,查看运行的容器
[root@bogon ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e642b530568 nginx:1.13.7-alpine "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx.4.3r68n9z4jyuydeqyshq1iqkku
21de546363bd nginx:1.13.7-alpine "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx.1.ovyg8ma03iutfle6r8qv7cyj4
#选中一台4e642b530568进行停止操作,docker stop 容器ID或容器名
[root@bogon ~]# docker stop 4e642b530568
4e642b530568
#再次查看该服务器运行容器
[root@bogon ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21de546363bd nginx:1.13.7-alpine "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx.1.ovyg8ma03iutfle6r8qv7cyj4
[root@bogon ~]#
#回到管理节点,查看服务数量,发现少了一个
[root@bogon ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 4/5 nginx:1.13.7-alpine *:80->80/tcp
[root@bogon ~]#
#更新服务
#将nginx的版本升级到1.13.8-alpine
#先看下当前运行的服务使用的镜像
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 5/6 nginx:1.13.7-alpine *:80->80/tcp
#执行服务镜像更新。默认配置下,Swarm 一次只更新一个副本,并且两个副本之间没有等待时间。
#nginx为服务名
[root@manager ~]# docker service update --image nginx:1.13.8-alpine nginx
nginx
overall progress: 0 out of 6 tasks
overall progress: 0 out of 6 tasks
overall progress: 1 out of 6 tasks
1/6: running [==================================================>]
2/6: preparing [=================================> ]
3/6: No such image: nginx:1.13.8-alpine@sha256:c8ff0187cc75e1f5002c7ca9841cb191…
6/6:
service update paused: update paused due to failure or early termination of task iyomg9d9pd0lqwr7kvp2yvvj1
#再次查看运行的服务使用的镜像,镜像已更新为nginx:1.13.8-alpine
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 5/6 nginx:1.13.8-alpine *:80->80/tcp
#回滚服务
如果更新后的镜像有问题,那么如何回滚?
方式一:使用docker service update --rollback nginx
请注意,--rollback
只能回滚到上一次执行 docker service update
之前的状态,并不能无限制地回滚。
#先看下原来的服务使用的镜像
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.8-alpine *:80->80/tcp
#执行回滚操作
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback
overall progress: rolling back update: 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
#再次查看服务镜像,发现已回滚到上次使用udpate时的镜像
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.7-alpine *:80->80/tcp
#那么再次执行回滚看看效果,发现又回滚到nginx:1.13.8-alpine
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback
overall progress: rolling back update: 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@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.8-alpine *:80->80/tcp
[root@manager ~]#
#那么再次执行回滚看看效果,发现又回滚到nginx:1.13.7-alpine
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback
overall progress: rolling back update: 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@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.7-alpine *:80->80/tcp
#上述实验说明,--rollback操作只会回滚到上一次更新的镜像
方式二:还是通过docker service update --image nginx:1.13.7-alpine nginx 指定更新到原来的镜像
#先看下当前运行的服务使用的镜像
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.8-alpine *:80->80/tcp
#执行更新服务命令
[root@manager ~]# docker service update --image nginx:1.13.7-alpine nginx
nginx
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@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
io27pypwapy4 nginx replicated 6/6 nginx:1.13.7-alpine *:80->80/tcp
Docker常用命令总结:https://blog.csdn.net/coolcoffee168/article/details/90237427
docker命令官网教程:https://docs.docker.com/engine/reference/commandline/swarm_leave/
https://www.cnblogs.com/bigberg/p/8761226.html