当前位置: 首页 > Linux

企业级微服务实战(五)

时间:2023-04-06 18:43:21 Linux

镜像制作(一)基于容器制作镜像制作镜像有两种方式,一种是基于容器,一种是基于Dockerfile,两者各有千秋的优点和缺点。基于容器创建非常简单,但不利于容器的批量创建和部署。还有一个很重要的缺点,就是你不知道镜像是怎么创建的,这对运维工作是非常不利的。基于Dockerfile创建容器需要熟悉Dockerfile语法,创建难度大,镜像调试过程繁琐;但是一旦创建,就很容易批量创建和部署,而且镜像创建过程非常清晰,很容易定位到镜像中的各种问题。先介绍一下基于容器创建镜像。这里我们使用dockercommit命令,命令语法:[root@docker-server~]#dockercommit-hFlagshorthand-hhasbeendeprecated,请使用--helpUsage:dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]从容器的changesOptions创建一个新镜像:-a,--authorstringAuthor(e.g.,"JohnHannibalSmith")-c,--changelist将Dockerfile指令应用于创建的镜像-m,--messagestringCommitmessage-p,--pausecommit时暂停容器(默认true)[环境准备]为了不影响效果,我们停止并删除所有容器,重新下载最新的busybox镜像。[root@docker-server~]#dockerimagesbusyboxREPOSITORYTAGIMAGEIDCREATEDSIZEbusybox1.31.019485c79a9bb6weeksago1.22MBbusyboxlatest19485c79a9bb6weeksago1.22MBSTATUSPORTSNAMES这个时候我们应该申请一个DockerHub账号,或者申请阿里云上的个人仓库。因为国内网络连接一直无法登录DockerHub,所以下面使用我在阿里云上使用私有仓库演示。首先我们登录私有仓库:dockerlogin--username=YOUR_USERNAMEregistry.cn-beijing.aliyuncs.com替换成你的用户名和密码,登录提示“登录成功”。【启动容器并创建文件】#启动容器[root@docker-server~]#dockerrun--namedemo1--rm-it19485c79a9bb#创建测试脚本文件,内容如下:/#cat/bin/演示。sh#/bin/shecho"HelloWorld!"#添加执行权限/#chmod+x/bin/demo.sh#测试执行/#demo.shHelloWorld!【创建镜像并推送到仓库】我们现在是基于这个容器来创建镜像。如果创建成功,脚本文件将包含在新的镜像中。#查看容器ID,我们需要根据这个ID创建镜像[root@docker-server~]#dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESa9a1cd89089619485c79a9bb"sh"大约一分钟前Up大约一分钟demo1#基于容器创建一个镜像[root@docker-server~]#dockercommit-m'添加demo.sh执行脚本'-pa9a1cd890896registry.cn-beijing.aliyuncs.com/byte-edu/busybox:v0.1sha256:fb2c0d1d39ec0185a64f49fdf39c2197be56aaed48bcc35查看257be56aaed5bcc35#并推送镜像[root@docker-server~]#dockerpushregistry.cn-beijing.aliyuncs.com/byte-edu/busybox推送参考仓库[registry.cn-beijing.aliyuncs.com/byte-edu/busybox]9cb5ee688337:Pushed6c0ea40aef9d:Mountedfrombyte-edu/mydockerv0.1:digest:sha256:226a6eaf946bbac13a19fa94ae90abf1903932fc46861c3872e6ee3345c30413size:734推入本地仓库即可。当然,同样可以在仓库中创建。[根据镜像启动新的容器][root@docker-server~]#dockerrun--namedemo2--rm-itfb2c0d1d39ec/#demo.shHelloWorld!/#可以看到基于镜像创建的容器新镜像中已经包含了demo.sh脚本,即基于容器创建镜像。当然我们也可以这样查看:[root@docker-server~]#dockerrun--namedemo3-itfb2c0d1d39ec/bin/demo.shHelloWorld!意思是替换容器默认的执行命令,使用/bin/demo.sh这个脚本,所以直接输出这个脚本的结果。【命令介绍】这里给大家介绍一下上面的命令:dockercommit-m'添加demo.sh执行脚本'-pa9a1cd890896registry.cn-beijing.aliyuncs.com/byte-edu/busybox:v0.1-m参数用于指定提交信息。一般我们会说明这次投稿主要修改了什么;-p参数表示创建镜像时容器暂停,因为容器一直在运行,可能会导致新的数据写入,所以比较合适的方式会加上-p参数;命令补充这里我们添加一个比较重要的命令dockertag,我们知道镜像的tag信息决定了镜像的版本,“镜像名称”决定了镜像的存储仓库位置。那么我们如何修改呢?[root@docker-server~]#dockertag--helpUsage:dockertagSOURCE_IMAGE[:TAG]TARGET_IMAGE[:TAG]创建一个引用SOURCE_IMAGE的tagTARGET_IMAGE假设我们要推送busybox:latest镜像到阿里云私有仓库,需要做如下设置:[root@docker-server~]#dockerimagesbusyboxREPOSITORYTAGIMAGEIDCREATEDSIZEbusybox1.31.019485c79a9bb6weeksago1.22MBbusyboxlatest19485c79a9bb6weeksago1.22MB[root@docker-server~dockertagbusybox:latestregistry.cn-beijing.aliyuncs.com/byte-edu/busybox:latest这里我们也将tag设置为latest进行简单测试。现在可以推送到阿里云的私有仓库了:[root@docker-server~]#dockerpushregistry.cn-beijing.aliyuncs.com/byte-edu/busybox推送指的是仓库[registry.cn-beijing.aliyuncs.com/byte-edu/busybox]6c0ea40aef9d:Layeralreadyexistslatest:digest:sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808size:5279cb5ee688337:Layeralreadyexists6c0ea40aef9d:Layeralreadyexistsv0.1:digest:sha256:226a6eaf946bbac13a19fa94ae90abf1903932fc46861c3872e6ee3345c30413size:734推送成功后,就可以在镜像仓库可以在网站上看到我们刚刚推送的镜像,当然你也可以直接下载使用,方法和我们直接拉取一样,比如:dockerpullregistry.cn-beijing.aliyuncs.com/byte-edu/busybox。那么如何删除一个不需要的仓库和标签呢?[root@docker-server~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZERegistry.cn-beijing.aliyuncs.com/byte-edu/busyboxv0.1fb2c0d1d39ec29分钟前1.22MBnginxlatest5a9061639d0a2天前126MBregistryaliyuncs.com/byte-edu/mydockerv0.119485c79a9bb6周前1.22MBbusybox1.31.019485c79a9bb6周前1.22MBbusybox最新19485c79a9bb6周前1.22MBregistry.cn-beijing.aliyuncs.com/byte-edu/busybox2最新194985c7MB你好世界最新fce289e99eb99个月前1.84kB让我们看一下我本地机器的当前图像。可以看到有四个镜像ID是一样的,只是仓库名不同。如果我们删除其中一张图片会怎样?[root@docker-server~]#dockerrmiregistry.cn-beijing.aliyuncs.com/byte-edu/mydocker:v0.1Untagged:registry.cn-beijing.aliyuncs.com/byte-edu/mydocker:v0.1Untagged:registry.cn-beijing.aliyuncs.com/byte-edu/mydocker@sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808[root@docker-server~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEyubeijbusing.cn-v0.1fb2c0d1d39ec33分钟前1.22MBnginx最新5a9061639d0a2天前126MBbusybox1.31.019485c79a9bb6周前1.22MBbusybox最新19485c79a9bb6周前1.22MBregistry.cn-beijing.aliyuncs.com/byte-edu/busybox最新19485c79a9bb6周前1.22MBhello-world最新fce289e99eb99个月前1.84kB因此,当创建多张图片时,基于相同的图片名称"image》其实并不是在系统上复制了多份,而是使用同一个底层镜像,只是在镜像的基础上设置了不同的标签和仓库名称。如果我们要删除某个“镜像名称”,只需删除该名称后,底层镜像仍然存在,直到一个镜像上只有一个“镜像名称”,删除后基础镜像才会被删除。注:更多技术博客,请关注字节教育官网。如果在自己实验过程中遇到问题,及时与作者沟通。[QQ群374106486]