极简容器化交付|0命令行完成镜像上传(代码片段)

author author     2023-02-24     136

关键词:

虽然docker、kubernetes的命令集并非十分复杂,后台操作也比较快捷,但是对于大多数徘徊在容器化门口的企业和个人用户来说,仍旧是一块心病,docker or not docker, that‘s a question,SWR服务通过提供界面化的操作,屏蔽原生命令行,简化用户操作和技术门槛,为企业和个人用户提供极简的容器化交付平台,我们接下来会通过一系列的文章,向大家介绍SWR的这些功能特性。

今天要为大家介绍的是用户0命令行,通过WEB界面实现镜像的上传及实现原理剖析。

我们从这个最为常用并极为简单的docker push功能开始讲,为什么呢?由于我们在与客户交流过程中发现,大多数都未接触过容器化管理系统,甚至镜像,对后端操作不熟悉的他们,对页面操作是有一定需求的。目前主流的PaaS平台基本都支持通过页面操作构建镜像、创建集群、创建应用等等,它们都在不断地封装底层集群管理系统(如kubernetes)的接口,设计一款对于云下用户友好的前端页面,让尽可能多的后端复杂操作可以通过鼠标的几次点击完成。

我们可以将这个趋势解释为,用户的业务云化的成本(包括金钱成本和时间成本)越低,上云的倾向也就越大。如今,我们支持用户在页面上完成构建、部署等操作,如果可以实现镜像上传下载都在页面上完成,用户就可以在尝试云化的早期尽可能避开后端操作,将尽可能多的时间成本花在业务调试上,普通运维人员不需要熟悉docker命令,也可以从内网或者第三方镜像仓库下载镜像,上传并完成升级操作。

接下来,我们从镜像上传逻辑和镜像结构开始讲起,阐述如何去实现页面上传镜像的功能。

后端上传镜像流程分析

我们的目的是实现另一种镜像上传方式,首先要了解原生的镜像上传流程是怎样的。

上传镜像层

docker push时,最先被上传的是镜像层文件。如下面的busybox,每一行的short ID都表示着一个镜像层的sha256值,它有两个镜像层:

技术分享图片
上传元数据文件

由于层之间有顺序依赖关系,我们可以想到,上传的层文件是不足以完备地描述整个镜像的。除了镜像层文件外,docker push的时候还额外会上传一个镜像的元数据文件。该文件主要保存了镜像的环境变量、层结构、构建信息等等,并且它的sha256值就是镜像的ID。由于字段太多,在此不详细列出各字段的含义,感兴趣的朋友可以使用docker inspect命令查看,参阅docker官方文档了解一下。

技术分享图片

上传manifest

你们是否注意到,每个镜像在上传结束之后,屏幕上都会多一行xxx: digest: xxx size: xxx,最后一行信息的打印,标识着镜像最后一部分数据上传完成,这部分数据就是manifest,而digest后面的长ID,就是manifest的sha256值。

manifest主要是负责关联镜像的元数据文件和镜像层。在所有层都上传结束后,它才被传到仓库端的,用于校验是否所有实体文件都上传完成。通过抓包或者查阅官方文档,我们可以得知,manifest的结构是这样的:

技术分享图片
由上述分析可知,要完备地描述一个镜像,需要存储如下数据:

镜像层

元数据文件

Manifest

我们接下来分析一下,从docker save生成的镜像包里,我们是否能获取到这些数据。

镜像压缩包结构分析

通过docker save保存镜像压缩包,解压开之后,可以发现,它的文件结构是比较有序的。

技术分享图片
根目录下有这三个文件:

技术分享图片
此外,包内还有多个以长ID命名的目录,每个目录下均有如下三个文件:

技术分享图片
这里,有两个较为普遍的误区需要澄清一下:

误区一:manifest.json就是manifest

manifest里描述的是元数据文件名称,以及各个层的sha256值,此外,还有它们的大小。

而manifest.json里存放的不是完整的manifest信息,它仅仅记录了元数据文件的全路径名称,以及各个镜像层的全路径名称,没有记录各个层的sha256值和大小。

误区二:各个层所在的目录名就是镜像层的sha256值

其实目录名是用各个层的链ID(chain ID)和关联父层的链ID联合计算出来的一个特殊sha256值。这个特殊的sha256值,我们可以称之为v1 ID,它被设计于兼容较早版本(1.10之前)的docker镜像,早期版本,一个镜像中可能存在多个sha256值相同的层(如空层)。

顺带提一下,上面的链ID是docker daemon使用递归的方式将每一层与依赖的所有父层联合算出sha256得到的,它可以有效解决层相同导致目录重名的问题,具体计算方式在此就不赘述了。

明白了这两点之后,我们可以发现,镜像压缩包里是可以获取到与docker push同样完备的镜像数据的。其中,镜像层和元数据文件可以通过解压直接获取,而manifest则需要我们通过补充manifest.json获得。接下来我们看一看华为云容器镜像服务是怎么实现这一过程的。

页面上传是怎么实现的

技术分享图片
解压并校验

镜像压缩包传至后端时,先对压缩包里的文件类型校验(普通文件、软链接、目录),确认无误之后,解压至临时目录并进行大小校验(前端上传目前有大小限制)。

此外,有一类镜像需要被过滤:通过docker save image_id > image.tar命令生成的镜像包。这类镜像是没有有效的镜像仓库和版本号信息的,我们无法判断要将其归于哪个仓库下,因此,这样的镜像可以认为是不合法的。对于页面上传而言,合法的镜像压缩包里必须有镜像仓库和版本号信息(如使用docker save repository:tag > image.tar的方式生成的镜像)。

保存实体文件

接下来,通过临时目录下的manifest.json,找到对应的元数据文件xxxx.json和各个目录下的镜像层文件进行存储。保存之前,通过元数据文件xxxx.json中各个层的sha256值,对实际镜像文件进行校验,保存过程中,我们在manifest.json的基础上,补充各个镜像层和元数据文件的sha256值、大小等信息,得到manifest。

在这里有个需要注意的地方,层文件一般都是普通文件,但是个别情况下(如docker1.10之前的版本),层文件可能是软链接,指向同镜像压缩包里的的另一个层文件,如果要兼容老版本,需要识别出这一部分特殊文件,跳过实体文件的保存。

保存元数据

最后,将镜像层元数据列表和manifest元数据在同一事务里存进数据库,保证镜像元数据的存储是一个原子操作,则镜像所有数据保存完成。该镜像可以通过docker pull的方式正常下载。

这只是华为云容器镜像服务基于优化用户体验的目的而开发的特性之一,我们一直致力于降低云容器技术的槛和使用成本,推进软件行业容器化的进程,希望有兴趣的朋友可以来体验一下,并提供你们宝贵的意见。

除此之外,我们最近还新上线了容器持续交付的工具,可以将您的源码快速编译、构建成镜像,省去本地编写Dockerfile、镜像制作、发布和部署的繁琐过程,后面文章我们将详细为您介绍。

docker常用命令(代码片段)

...像#dockerpull镜像名删除镜像#dockerrmi镜像名实例化镜像创建容器#dockerrun[可选常用参数]镜像名run常用参数--name容器名-d后台方式运行-it使用交互方式运行可以进入容器-p指定端口容器端口:映射出的端口查看镜像列表#dockerimages-->... 查看详情

docker应用容器化(代码片段)

Docker 的核心思想就是如何将应用整合到容器中,并且能在容器中实际运行。将应用整合到容器中并且运行起来的这个过程,称为“容器化”(Containerizing),有时也叫作“Docker化”(Dockerizing)。容器是为应用而... 查看详情

华为云容器化交付流水线引领企业容器化之路(代码片段)

...16日,OSChina在深圳举办的”源创会年终盛典”上,华为云容器服务技术总监发表了名为《DevOpsOnKubernetes》的主题演讲,演讲就如何将DevOps理念与容器技术相结合,实现容器化场景下的快速交付进行介绍,并重点介绍了华为云容器... 查看详情

华为云容器交付流水线引领企业容器化之路(代码片段)

...16日,OSChina在深圳举办的”源创会年终盛典”上,华为云容器服务技术总监发表了名为《DevOpsOnKubernetes》的主题演讲,演讲就如何将DevOps理念与容器技术相结合,实现容器化场景下的快速交付进行介绍,并重点介绍了华为云容器... 查看详情

docker和fastdfs上传和下载文件(代码片段)

...aha#4.运行以下的命令:sudodockerload-ifastdfs_docker.tar开启tracker容器我们将tracker运行目录映射到宿主机的 /var/fdfs/tracker目录中。在命令行运行这句话,开启tracker容器.udodockerrun-dit--name=tracker--network=host-v/var/fdfs/tracker:/var/fdfsdelron/fastdfs... 查看详情

docker01:镜像和容器的基础命令使用(代码片段)

...用的问题!  关于镜像的操作命令 已经知道,容器是镜像的运行的实例,所以想要运行一个容器,事先得拥有这个容器的镜像。 1.使用页面搜索镜像:在默认的注册点dockerhub,不管是官方还是非官方都上传了很多... 查看详情

docker基础命令(代码片段)

...存储到本机上,命名为nginx_latest载入镜像上传镜像3、容器操作查询容器创建容器启动、停止、重启容器进入容器容器导出、导入删除容器总结Docker基础命令1、查看Docker版本信息docker 查看详情

docker生成镜像上传到dockerhub(代码片段)

...个账号然后在服务器登陆docker账号dokerlogin运行命令查看容器dockerps-a选择一个你要生成镜像的容器IDdockercommit容器ID生成的镜像名字运行命令查看生成的镜像dockerimages修改镜像repositorydockertag镜像名或IDdockerHub用户名/dockerHub仓库名:t... 查看详情

阿里云镜像服务关联github上传docker容器制作的镜像(代码片段)

本文目录写在前面配置前须知step0上篇文章step1查看容器step2注册阿里云并绑定Githubstep3创建镜像仓库step4制作镜像step5进入仓库查看仓库信息step6命令行登录阿里云容器镜像服务网站写在前面配置前须知请用root用户登录虚拟机࿰... 查看详情

docker学习笔记——镜像仓库制作(公有+私有+harbor)(代码片段)

...上传2)镜像下载3.镜像加速器1)阿里云加速器二、docker本地容器镜像仓库1.使用registry容器镜像实现本地非安全镜像仓库1)下载registry容器镜像2)创建用于挂载至registry镜像启动的仓库中,便于容器镜像持久保存3)启动容器获取镜... 查看详情

docker学习笔记——镜像仓库制作(公有+私有+harbor)(代码片段)

...上传2)镜像下载3.镜像加速器1)阿里云加速器二、docker本地容器镜像仓库1.使用registry容器镜像实现本地非安全镜像仓库1)下载registry容器镜像2)创建用于挂载至registry镜像启动的仓库中,便于容器镜像持久保存3)启动容器获取镜... 查看详情

docker容器学习整理(代码片段)

...令1.2创建镜像1.3存出和载入镜像1.4上传镜像二、操作docker容器2.1创建容器2.2终止容器2.3进入容器2.4删除容器2.5导入和导出容器三、访问Docker仓库一、docker基本管理1.1docker常用命令1.1.1dockerimages#列出本机已有镜像1.1.2tag命令添加镜... 查看详情

docker命令(代码片段)

...3.dockerrmi镜像id/镜像名删除镜像(多个)4.dockercommit用运行的容器创建镜像参数:-a作者-m‘注解‘容器名(id)镜像名:镜像版本号5.dockerpush镜像名:镜像版本号上传镜像三容器命令1.dockerps查看运行中的容器2.dockerps-a查看所有容器3.dockerrm... 查看详情

docker学习笔记——docker管理容器(代码片段)

文章目录Docker管理容器1.容器&镜像&仓库&daemon&client之间的关系2.启动容器3.dockerdaemon管理4.docker命令行5.docker命令行实现容器管理搜索镜像(dockerhub)获取镜像(pull)打包传输镜像启动容器解决docker中的CtenOS8镜像无法使用yum... 查看详情

docker学习笔记——docker管理容器(代码片段)

文章目录Docker管理容器1.容器&镜像&仓库&daemon&client之间的关系2.启动容器3.dockerdaemon管理4.docker命令行5.docker命令行实现容器管理搜索镜像(dockerhub)获取镜像(pull)打包传输镜像启动容器解决docker中的CtenOS8镜像无法使用yum... 查看详情

docker常用命令(代码片段)

dockerps#查看正在运行的容器dockerps-a#查看所有容器dockerps-l#查看最近一次运行的容器dockercreate容器名或者容器ID#创建容器dockerstart[-i]容器名#启动容器dockerrun容器名或者容器ID#运行容器,相当于dockercreate+dockerstartdockerattach容器名或... 查看详情

dockerfile构建微服务镜像(代码片段)

...ockerfile中添加以下内容#基于哪个镜像Fromjava:8#复制文件到容器ADDeureka-server-0.0.1-SNAPSHOT.jar/app.jar#声明需要暴露的端口EXPOSE8000#配置容器启动后执行的命令ENTRYPOINT["java","-jar"," 查看详情

华为云容器交付流水线引领企业容器化之路

...16日,OSChina在深圳举办的”源创会年终盛典”上,华为云容器服务技术总监发表了名为《DevOpsOnKubernetes》的主题演讲,演讲就如何将DevOps理念与容器技术相结合,实现容器化场景下的快速交付进行介绍,并重点介绍了华为云容器... 查看详情