浅述 Docker 的容器编排

fb9dcb118e749ea64dd993d8d5bfe267.gif

作者 | 天元浪子

来源 | CSDN博客

f32dd4f5182724f3cd37d8e78e3047bd.png

概述

作为容器引擎,Docker为容器化的应用程序提供了开放标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。所谓容器编排,通俗一点可以理解为集群管理。

Docker的容器编排工具有很多,最出名的当属Compose、Machine和Swarm,合称Docker三剑客。其中Compose和Machine是第三方的,而Swarm则是Docker官方的容器编排工具,已经被集成在Docker中了。

Swarm由三大部分组成:

  • swarm:集群管理

  • node:节点管理

  • service:服务管理

c22f4f114cb0b90fd24c2e42a2f1b67d.png

集群与节点管理

使用 docker swarm 命令,可以创建或加入集群,Docker集群中的节点分为manager和worker两种。这两种节点,都可以运行Docker容器,但只有manager节点,拥有管理功能。

一个集群中,即便只有manager节点也可以正常的工作。

2.1 创建集群

我测试的环境有两台机器,ip地址分别为192.168.1.220和192.168.1.116。下面在192.168.1.220上创建集群:

# docker swarm init
Swarm initialized: current node (ppmurem8j7mdbmgpdhssjh0h9) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-3e4l8crbt04xlqfxwyw6nuf9gtcwpw72zggtayzy8clyqmvb5h-7o6ww4ftwm38dz7ydbolsz3kd 192.168.1.220:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

执行 docker swarm init 后,集群就被创建好了。当前的机器,自动成为集群的manager节点,并且输出了其他机器加入集群的方式,

即:docker swarm join --token SWMTKN-1-3e4l8crbt04xlqfxwyw6nuf9gtcwpw72zggtayzy8clyqmvb5h-7o6ww4ftwm38dz7ydbolsz3kd 192.168.1.220:2377。

使用这个token加入的节点,是worker节点,如果想加入一个新的manager节点,可以执行 docker swarm join-token manager,它也会输出一串类似的命令,执行就可以以manager的方式加入。如果忘记加入的命令,也可以使用docker swarm join-token worker 进行查看。

2.2 加入集群

下面在192.168.1.116上执行加入命令:

# docker swarm join --token SWMTKN-1-12dlq70adr3z38mlkltc288rdzevtjn73xse7d0qndnjmx45zs-b1kwenzmrsqb4o5nvni5rafcr 192.168.1.220:2377
This node joined a swarm as a worker.

这里发生了一个小插曲,在我创建集群的两台机器的时区不一致,导致在加入worker节点时报错:

Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid

在更新了220的时区后,依然无法加入。于是,我删除了集群又重新创建,就可以了。没有尝试使用docker swarm update是不是也可以。

加入了集群后,可以在manager节点上,查询集群的节点:

# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9b4cmakc4hpc9ra4rruy5x5yo *   localhost.localdomain     Ready     Active         Leader           20.10.3
hz50cnwrbk4vxa7h0g23ccil9     zhangmh-virtual-machine   Ready     Active                          20.10.1

2.3 退出集群

在192.168.1.116上执行下面命令,可以退出集群:

# docker swarm leave                                                                                                           
Node left the swarm.

再次查看节点:

# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9b4cmakc4hpc9ra4rruy5x5yo *   localhost.localdomain     Ready     Active         Leader           20.10.3
hz50cnwrbk4vxa7h0g23ccil9     zhangmh-virtual-machine   Down      Active                          20.10.1

发现刚退出的这个节点还在,只是状态变成了Down。需要在manager节点中删除:

# docker node rm hz50cnwrbk4vxa7h0g23ccil9
hz50cnwrbk4vxa7h0g23ccil9
# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9b4cmakc4hpc9ra4rruy5x5yo *   localhost.localdomain     Ready     Active         Leader           20.10.3
xby86ffkqw3axyfkwd4s7nubz     zhangmh-virtual-machine   Ready     Active                          20.10.1

这样才真正删除了节点。

如果退出的节点是manager节点,需要强制退出,即:docker swarm leave -f。

2.4 将节点提升为 manager 节点

只有一个manager的集群是不稳定的,当manager节点崩溃时,整个集群就群龙无首了。Docker认为,一个集群中应该至少有三个manager节点,并且有一半以上的manager节点是可达的,才能保证集群的正常运行。当集群中只有两个manager节点,且有一个节点出现问题时,整个集群还是处于不可用的状态。

当然,对于我们测试,是没有必要的,我们只需要使用两个manager节点,测试一下是否可以主从切换就可以了。使用下面的命令,可以直接将workder节点提升为manager节点:

# docker node promote xby86ffkqw3axyfkwd4s7nubz
Node xby86ffkqw3axyfkwd4s7nubz promoted to a manager in the swarm.
# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9b4cmakc4hpc9ra4rruy5x5yo *   localhost.localdomain     Ready     Active         Leader           20.10.3
xby86ffkqw3axyfkwd4s7nubz     zhangmh-virtual-machine   Ready     Active         Reachable        20.10.1

OK,现在有两个manager节点了,192.168.1.220的状态为leader,即当前是领导节点,192.168.1.116的状态为Reachable,是可达的。下面关闭192.168.1.220节点的Docker服务:

# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:docker.socket

关闭时输出了一个警告,意思是Docker服务已经被关闭了,但它仍然可被docker.socket服务唤醒。再次查看节点状态:

# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9b4cmakc4hpc9ra4rruy5x5yo *   localhost.localdomain     Ready     Active         Reachable        20.10.3
xby86ffkqw3axyfkwd4s7nubz     zhangmh-virtual-machine   Ready     Active         Leader           20.10.1

可以看到192.168.1.116已经成为了Leader,并且,192.168.1.220也已经被唤醒。

由此可见,Docker集群的稳定是相当不错的。

8859764a80e0e602cf8da6a85d49f982.png

服务管理

集群中各节点都配置好后,就可以创建服务了。Docker的服务其实就是启动容器,并且赋予了容器副本和负载均衡的能力。以之前创建的ws:1.0为例,创建5个副本:

# docker service create --replicas 5 --name ws -p 80:8000 ws:1.0
image ws:1.0 could not be accessed on a registry to record
its digest. Each node will access ws:1.0 independently,
possibly leading to different nodes running different
versions of the image.1nj3o38slbo2zwt5p69l1qi5t
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

服务已经创建并运行了,使用浏览器访问192.168.1.220和192.168.1.116的80端口都可以访问。

使用 docker service ls 命令可以查看ws服务:

# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE     PORTS
1nj3o38slbo2   ws        replicated   5/5        ws:1.0    *:80->8000/tcp

使用 docker service ps ws 命令可查看ws服务的进程:

# docker service ps ws
ID             NAME      IMAGE     NODE                      DESIRED STATE   CURRENT STATE           ERROR     PORTS
jpckj0mn24ae   ws.1      ws:1.0    zhangmh-virtual-machine   Running         Running 6 minutes ago             
yrrdn4ntb089   ws.2      ws:1.0    localhost.localdomain     Running         Running 6 minutes ago             
mdjxadbmlmhs   ws.3      ws:1.0    zhangmh-virtual-machine   Running         Running 6 minutes ago             
kqdwfrddbaxd   ws.4      ws:1.0    localhost.localdomain     Running         Running 6 minutes ago             
is2iimz1v4eb   ws.5      ws:1.0    zhangmh-virtual-machine   Running         Running 6 minutes ago

可以看到有两个进程运行在192.168.1.220上,三个进程运行在192.168.1.116上。我在浏览器上访问了几次之后 ,使用 docker service logs ws 命令查看服务的日志:

# docker service logs ws
ws.5.is2iimz1v4eb@zhangmh-virtual-machine    | [I 210219 01:57:23 web:2239] 200 GET / (10.0.0.2) 3.56ms
ws.5.is2iimz1v4eb@zhangmh-virtual-machine    | [W 210219 01:57:23 web:2239] 404 GET /favicon.ico (10.0.0.2) 0.97ms
ws.5.is2iimz1v4eb@zhangmh-virtual-machine    | [I 210219 01:57:28 web:2239] 200 GET / (10.0.0.4) 0.82ms
ws.5.is2iimz1v4eb@zhangmh-virtual-machine    | [W 210219 01:57:28 web:2239] 404 GET /favicon.ico (10.0.0.4) 0.79ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:01:45 web:2239] 304 GET / (10.0.0.2) 1.82ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:01:59 web:2239] 304 GET / (10.0.0.2) 0.49ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:01 web:2239] 304 GET / (10.0.0.2) 2.05ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:02 web:2239] 304 GET / (10.0.0.2) 0.89ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:02 web:2239] 304 GET / (10.0.0.2) 1.13ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:03 web:2239] 304 GET / (10.0.0.2) 0.92ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:03 web:2239] 304 GET / (10.0.0.2) 2.19ms
ws.1.jpckj0mn24ae@zhangmh-virtual-machine    | [I 210219 02:02:20 web:2239] 304 GET / (10.0.0.2) 1.00ms

可以看到即使我访问的是192.168.1.220,而实际访问的扔然是192.168.1.116上的进程。

如果把192.168.1.116关机,其上运行的进程会自动转移到192.168.1.220的节点中,因为192.168.1.116现在是manager节点,如果停止,集群会进入不可用的状态,所以,需要先将其降级为worker节点:

# docker node demote xby86ffkqw3axyfkwd4s7nubz
Manager xby86ffkqw3axyfkwd4s7nubz demoted in the swarm.

然后,将192.168.1.116关机。

# docker service ps ws
ID             NAME       IMAGE     NODE                      DESIRED STATE   CURRENT STATE                ERROR  PORTS
jrj9ben9vr5c   ws.1       ws:1.0    localhost.localdomain     Running         Running 57 minutes ago                         
yrrdn4ntb089   ws.2       ws:1.0    localhost.localdomain     Running         Running about an hour ago                       
opig9zrmp261   ws.3       ws:1.0    localhost.localdomain     Running         Running 57 minutes ago                         
kqdwfrddbaxd   ws.4       ws:1.0    localhost.localdomain     Running         Running about an hour ago
hiz8730pl3je   ws.5       ws:1.0    localhost.localdomain     Running         Running 57 minutes ago

可以看到5个进程都转移到192.168.1.220上运行了。

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS     NAMES
bc4c457ce769   ws:1.0    "/bin/sh -c 'python …"   3 hours ago   Up 3 hours             ws.5.hiz8730pl3je7qvo2lv6k554b
c846ac1c4d91   ws:1.0    "/bin/sh -c 'python …"   3 hours ago   Up 3 hours             ws.3.opig9zrmp2619t4e1o3ntnj2w
214daa36c138   ws:1.0    "/bin/sh -c 'python …"   3 hours ago   Up 3 hours             ws.1.jrj9ben9vr5c3biuc90xtoffh
17842db9dc47   ws:1.0    "/bin/sh -c 'python …"   3 hours ago   Up 3 hours             ws.4.kqdwfrddbaxd5z78uo3zsy5sd
47185ba9a4fd   ws:1.0    "/bin/sh -c 'python …"   3 hours ago   Up 3 hours             ws.2.yrrdn4ntb089t6i66w8xvq8r9
# docker kill bc4c457ce769
bc4c457ce769

杀死第5个进程后,等待几秒再查看进程:

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
416b55e8d174   ws:1.0    "/bin/sh -c 'python …"   About a minute ago   Up About a minute             ws.5.fvpm334t2zqbj5l50tyx5glr6
c846ac1c4d91   ws:1.0    "/bin/sh -c 'python …"   3 hours ago          Up 3 hours                    ws.3.opig9zrmp2619t4e1o3ntnj2w
214daa36c138   ws:1.0    "/bin/sh -c 'python …"   3 hours ago          Up 3 hours                    ws.1.jrj9ben9vr5c3biuc90xtoffh
17842db9dc47   ws:1.0    "/bin/sh -c 'python …"   3 hours ago          Up 3 hours                    ws.4.kqdwfrddbaxd5z78uo3zsy5sd
47185ba9a4fd   ws:1.0    "/bin/sh -c 'python …"   3 hours ago          Up 3 hours                    ws.2.yrrdn4ntb089t6i66w8xvq8r9

第5个进程又被启动。

Docker服务的副本数量是可以动态调整的,比如系统负载过高,需要添加副本时,只需要执行:

# docker service scale ws=6
ws 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

这样,就增加了一个副本。

服务创建好以后,就可以随着Docker的系统服务被启动,只要执行:

systemctl enable docker

刚才创建的集群和服务都会开机启动,不用担心机器重启导致程序运行不正常。

b9c0eca9da1320149ae5660d7ecbffda.png

共享数据卷

首先,使用 docker volume create 命令创建一个数据卷:

# docker volume create ws_volume
ws_volume

创建完成后,使用 docker volume ls 命令可查看现有的数据卷:

# docker volume ls
DRIVER    VOLUME NAME
local     ws_volume

使用 docker inspect 命令可查看数据卷的详细信息:

# docker inspect ws_volume
[{"CreatedAt": "2021-02-19T14:09:58+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/ws_volume/_data","Name": "ws_volume","Options": {},"Scope": "local"}
]

在创建service时,可使用 --mount 参数将数据卷挂载到service中:

# docker service create --replicas 2 --name ws -p 80:8000 --mount type=volume,src=ws_volume,dst=/volume ws:1.0
image ws:1.0 could not be accessed on a registry to record
its digest. Each node will access ws:1.0 independently,
possibly leading to different nodes running different
versions of the image.iiiit9slq9qqwcdwwi0w0mcz5
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged

--mount 有很多的子参数,把它们写成key=value的形式,然后用逗号隔开即可,最简单的,只需要设置type、src、dst三个参数即可。

7270b29a4416816f47cf11de457b4d1d.gif

往期推荐

如果让你来设计网络

70% 开发者对云原生一知半解,“云深”如何知处?

一把王者的时间,我就学会了Nginx

如何在 Kubernetes Pod 内进行网络抓包

8c8037ab6ec2c668ef49f872b0cde6de.gif

点分享

0b7d54b98417f6999132f36d8386900f.gif

点收藏

5d90297a5244d79460c9c1c2a4cac43b.gif

点点赞

fadc21f42bc1833d0b7c4d8273ba1aac.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cloudera CDP 企业数据云测试开通指导

简介: 基于阿里云部署的 Cloudera CDP 企业数据云平台已经进入公测阶段,本文详细介绍了相关试用/试用流程。 基于阿里云部署的 Cloudera CDP 企业数据云平台已经进入公测阶段,如对该平台感兴趣,可以使用下面的流程进行试用。 如需…

重装linux之后gcc等下载不了,Redhat linux下安装gcc

一、安装步骤1、使用whichgcc命令发现gcc没有安装2、拷贝gcc-3.2.2-5.i386.rpm 尝试安装说明在这之前还需要先装binutils、cpp、glibc-devel这三个包3、拷贝binutils-2.13.90.0.18-9.i386.rpmcpp-3.2.2-5.i386.rpmglibc-devel-2.3.2-11.9.i386.rpm 到install目录分别安装rpm -i…

解决 Serverless 落地困难的关键,是给开发者足够的“安全感”

简介:越来越多的云产品都会向全托管、Serverless 形态演进。当云的产品体系 Serverless 化达到一个临界值,通过函数计算这样的 Serverless 计算服务结合其他 Serverless 形态的云服务,能够完整的实现整个应用时,Serverless 就会变…

如何通过任务调度实现百万规则报警

简介:报警是一个公司的日常需求,常见的形态除了满足运维过程中的基础设施监控报警(CPU/内存/磁盘等)之外,部分公司也会在应用指标(如 QPS、RT 等)及业务指标(如 GMV/日活 等&#xf…

linux无法关机 grub2,Ubuntu关机卡住无法关机如何解决?

电脑无法关机是最让人头疼的事,在Ubuntu系统中,有时会遇到关机卡住的情况,导致关不了机,遇到这种情况千万不要强制关机,下面小编就教你如何解决这个问题。解决方案:在终端用sudo vi打开/boot/grub/grub.cfg…

不用跑项目,组件效果所见即所得,绝了!

作者 | 零一来源 | 前端印象大家好,看到一个好东西,忍不住来分享一下。我们在写需求时都会封装一些组件,然后会为该组件定义一些 props ,使其跟业务分离,变得更通用。写完组件后需要验证一下组件的效果,也就…

Kubernetes 已经成为云原生时代的安卓,这就够了吗?

简介:本文将介绍如何在 Kubernetes 上构建新的应用管理平台,提供一层抽象以封装底层逻辑,只呈现用户关心的接口,使用户可以只关注自己的业务逻辑,管理应用更快更安全。 作者:司徒放 导语:云原生…

我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?

简介:在今年的天猫双 11 中,中间件支撑了 5403 亿的交易量,并全面升级到了公共云架构。 此次的架构升级,是以开源为内核、以公共云为基础、以 OpenAPI 进行解偶扩展,在架构上,对开源、自研、商业化进行统一…

两台电脑usb直连 linux,两台电脑怎么传文件没有网线(两台电脑usb直连)

对于两台电脑的数据传输而言,当下可通过各类社交(QQ,陌陌、微信.....)、传输(飞鸽传书、360快传......)软件都可以实现但由于各类软件需要下载安装以及相关软件学习使用成本,迫使很多用户都放弃了这种想法那么,今天我们对两台需要…

Gartner发布2022年数据分析十二大趋势:数据和分析将成为创新起源

数据与分析将会成为创新的起源,为企业发展创新助力同时,还将有基于数据的变现、降本增效,基于数据与分析的决策能力已成为有韧性企业的最核心能力。 作者 | 宋慧 出品 | CSDN 云计算 对数据的分析已经被企业与技术界愈加重视,国际…

重拾面向对象软件设计

简介:从上个世纪五十年代冯诺依曼创造第一台计算机开始,一直到现在只有短短70年时间,从第一门计算机语言FORTRAN,到现在我们常用的C,JAVA,PYTHON等,计算机语言的演进速度远超我们所使用的任何一…

数据与AI如何提升IT运维价值?锐捷发布乐享智能运维管理平台

运维的价值如何体现,听刚刚发布锐捷乐享智能运维管理平台的锐捷网络怎么说。 编辑 | 宋慧 出品 | CSDN云计算 运维可能是 IT 技术人中最苦的岗位。 IT系统运维工作就像安全一样,平稳运行不出事故是“份内事”,出了事故则要冲到修复一线。因此…

阿里云服务网格ASM集成SLS告警

简介:随着微服务的流行,微服务的架构也在不断的发展演进,Spring Cloud 与 Dubbo为代表的微服务开发框架也得到了普及和落地;在云原生时代,无侵入的服务网格(Service Mesh)开始走向成熟&#xff…

走进英特尔中国研究院探索创新日:发布最新科研成果与创新策略

如何穿越技术周期,英特尔揭秘创新策略与最新科研进展。 “2022英特尔中国研究院探索创新日”在北京举行。此次活动以“智探索汇无界”为主题,展示了英特尔中国研究院一系列前瞻性研究项目和创新成果。活动中,英特尔研究院副总裁、英特尔中国研…

零基础玩转SLS日志查询-SLS Query Builder发布

简介:日志服务(Log Service,简称 SLS) 是阿里云提供的行业领先的日志大数据解决方案,一站式提供数据收集、清洗、分析、可视化、告警等功能。智能查询分析是数据中台重要的一环,SLS支持秒级查询10亿到千亿级…

块存储监控与服务压测调优利器-EBS Lens发布

简介:SLS团队联合EBS团队发布了EBS Lens,针对块存储提供数据分析、资源监控的功能,可以帮助用户获取云上块存储资源信息与性能监控数据、提升云上块存储资源的管理效率、高效分析业务波动与资源性能消耗情况。 EBS监控现状 块存储是阿里云为…

阿里云 EventBridge 事件驱动架构实践

简介:我们认为 EventBridge 是云原生时代新的计算驱动力,这些数据可以驱动云的计算能力,创造更多业务价值。 作者:周新宇 本文内容整理自 中国开源年会 演讲 首先做一个自我介绍,我是 RocketMQ 的 PMC member 周新宇…

代理网关设计与实现(基于NETTY)

简介:本文重点在代理网关本身的设计与实现,而非代理资源的管理与维护。 作者 | 新然 来源 | 阿里技术公众号 一 问题背景 平台端购置一批裸代理,来做广告异地展现审核。从外部购置的代理,使用方式为:通过给定的HTTP …

Gartner 发布2022年数据分析十二大趋势:数据和分析将成为创新起源

作者 | 宋慧出品 | CSDN 云计算数据与分析将会成为创新的起源,为企业发展创新助力同时,还将有基于数据的变现、降本增效,基于数据与分析的决策能力已成为有韧性企业的最核心能力。对数据的分析已经被企业与技术界愈加重视,国际研究…

“2021ISIG中国产业智能大会低代码峰会”即将开幕,钉钉宜搭叶周全受邀出席

简介:2021年12月8-9日,“2021ISIG中国产业智能大会” 将在上海举行。阿里巴巴资深技术专家,钉钉宜搭创始人叶周全将作为特邀嘉宾出席大会。 2021年12月8-9日,由中国电子技术标准化研究院、苏州市金融科技协会、中国计算机用户协会…