涨薪技术|Docker容器技术之镜像(image)

📅 2026/7/29 13:19:51
涨薪技术|Docker容器技术之镜像(image)
前面的推文我们初步了解了Docker容器的一些知识今天开始给大家分享更详细的一系列关于Docker容器技术欢迎关注。Docker不管是程序员架构师或者测试工程师都必须要掌握的一门主流技术如果需要领取同步资料可以文末联系老师。01认识docker镜像Docker镜像是由文件系统叠加而成最低端是一个引导文件系统即bootfs这个很像Linux/Unix的引导文件系统Docker用户几乎永远不和引导文件系统有交互。Docker看起来很像一个Linux虚拟化栈Docker镜像的第二层是root文件系统rootfs它位于引导文件系统之上rootfs可以是一种或多种操作系统。在传统的Linux引导过程中root文件系统会先以只读的方式加载当引导结束并完成完整性检查后它才会被切换成读写模式但是在Docker中root文件系统永远只能是只读状态并且Docker利用联合加载(union mount)技术会在root文件系统层上加载更多的只读文件系统联合加载指的是一次同时加载多个文件系统但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起这样最终的文件系统会包含所有底层的文件和目录。Docker将这样的文件系统称为镜像一个镜像可以放到另一个镜像的顶部位于下面的镜像称之为父镜像(parent image)可以依次类推直到镜像栈的最底部最底部的镜像称之为基础镜像(base image)。最后当从一个镜像启支容器时Docker会在该镜像的最顶层加载一个读写文件系统。02拉取镜像镜像是运行容器的前提 官方的Docker Hub 网站已经提供了数十万个镜像供大家开放下载。本节主要介绍docker 镜像的pull 子命令可以使用docker [image] pull 命令直接从Docker Hub 镜像源来下载镜像。该命令的格式为docker [image] pull NAME [ :TAG]NAME 是镜像仓库名称(用来区分镜像) TAG 是镜像的标签(往往用来表示版本信息) 。通常情况下 描述一个镜像需要包括“名称标签“ 信息。如果在下载镜像时没有标示版本那么下载下来的将是最新版本标签为latest。[rootlocalhost ~]# docker pull httpd latest: Pulling from httpd //表示下载最新版的httpd镜像 e41adbd1cb5b: Pull complete 14d0dfd633f4: Pull complete 505c936535a7: Pull complete 427c82bd70cd: Pull complete Digest: sha256:3884dc098e89d69066965a2084884f47fed0be76461b5c6c96559b1328298e31Status: Downloaded newer image for httpd:latest下载过程中可以看出镜像文件一般由若干层(layer)组成427c82bd70cd这样的串是层的唯一id(实际上完整的id包括256比特64个十六进制字符组成)。可能有人会想到 在不同的镜像仓库服务器的情况下可能会出现镜像重名的情况。严格地讲镜像的仓库名称中还应该添加仓库地址(即registry, 注册服务器)作为前缀只是默认使用的是官方DockerHub服务该前缀可以忽略。例如 docker pull httpd命令相当于docker pull registry.hub.docker.com/httpd命令即从默认的注册服务器DockerHub Registry中的httpd仓库来下载标记为latest的镜像。03查看镜像查看镜像的命令通常有images、tag和inspect子命令。1.使用images命令列出本地镜像使用docker images 命令可以列出本地主机上已有镜像的基本信息。docker images例如​​​​​​​[rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE chuanshi/my_tomcat 1.1 8741c7742307 2 days ago 681.3 MB tomcat latest 299d4c2f91fd 11 days ago 679.5 MB httpd latest 427c82bd70cd 12 days ago 137.8 MB registry latest 6dbc9d47b4a0 2 weeks ago 26.23 MB redis latest a6edd7a55846 4 weeks ago 105.4 MB mysql latest cd6bac612785 4 weeks ago 513.8 MBREPOSITORY:表示来自于哪个仓库TAG:表示镜像的标签信息标签只是标记并不能标识镜像内容IMAGE ID:镜像ID镜像的唯一标识如果两个镜像ID相同则说明它们实际上指向了同一个镜像只是具有不同标签名而已CREATED:表示镜像最后的更新时间VIRTUAL SIZE:表示镜像大小好的镜像往往体积会较小。2.使用tag命令为镜像添加标签为了方便在后续工作中使用特定镜像还可以使用docker tag命令为本地镜像任意添加新的标签。举例​​​​​​​[rootlocalhost ~]# docker tag redis:latest test_redis:1.1 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE chuanshi/my_tomcat 1.1 8741c7742307 2 days ago 681.3 MB tomcat latest 299d4c2f91fd 11 days ago 679.5 MB httpd latest 427c82bd70cd 12 days ago 137.8 MB registry latest 6dbc9d47b4a0 2 weeks ago 26.23 MB redis latest a6edd7a55846 4 weeks ago 105.4 MB test_redis 1.1 a6edd7a55846 4 weeks ago 105.4 MB mysql latest cd6bac612785 4 weeks ago 513.8 MB其中test_redis和redis镜像的ID号是相同的其实对应的是同一个镜像只是使用不同的标签而已。3.使用inspect命令查看镜像详细信息使用inspect命令可以获取镜像的详细信息包括制作者、适应架构、各层的数字摘要等。命令的语法如下docker inspect 镜像名举例​​​​​​​[rootlocalhost ~]# docker inspect redis [ { Id: a6edd7a55846043cdc25121900dee5f244334c08ddcfd9995bed9708395dac3a, Parent: 5b5acb53ad733373bc3d6bbb1169d84892c42cd871c16041b9fe38126dd2d658, Comment: , Created: 2021-08-17T14:30:06.550779326Z, Container: fa59f1c2817c9095f8f7272a4ab9b11db0332b33efb3a82c00a3d1fec8763684, ContainerConfig: { Hostname: fa59f1c2817c, Domainname: , User: , AttachStdin: false, AttachStdout: false, AttachStderr: false, PortSpecs: null, ExposedPorts: { 6379/tcp: {} }上面返回的是一个JSON格式的消息如果只要其中某一项的内容时可以使用-f来指定语法格式如下docker insepect -f {{.项名}} 镜像名[rootlocalhost ~]# docker inspect -f {{.Id}} redis a6edd7a55846043cdc25121900dee5f244334c08ddcfd9995bed9708395dac3a4.使用history命令查看镜像历史既然镜像文件由多个层组成那么怎么才知道各层的内容具体是什么呢?这时候可以使用history子命令该命令将列出各层的创建信息。​​​​​​​[rootlocalhost ~]# docker history redis IMAGE CREATED CREATED BY SIZE COMMENT a6edd7a55846 4 weeks ago /bin/sh -c #(nop) CMD [redis-server] 0 B 5b5acb53ad73 4 weeks ago /bin/sh -c #(nop) EXPOSE 6379 0 B 14890a0e7ff6 4 weeks ago /bin/sh -c #(nop) ENTRYPOINT [dockerentryp 0 B b7a37aa916bd 4 weeks ago /bin/sh -c #(nop) COPY file:df205a0ef6e6df894 374 B e5b8c5fd5ee8 4 weeks ago /bin/sh -c #(nop) WORKDIR /data004查找镜像使用docker search 命令可以搜索Docker Hub 官方仓库中的镜像,语法为docker search [option] keyword举例​​​​​​​[rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store th... 9921 [OK] sameersbn/redis 83 [OK] grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2 79 rediscommander/redis-commander Alpine image for redis-commander - Redis m... 65 [OK] redislabs/redisearch Redis With the RedisSearch module pre-load... 38 redislabs/redisinsight RedisInsight - The GUI for RedisOFFICIAL表示是官方认证的镜像STARS表示获得的点赞扬数05删除和清理镜像1.使用标签删除镜像使用docker rmi或docker image rm命令可以删除镜像命令格式为docker rmi image [image...][rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest cee773705895 13 hours ago 231.2 MB my_centos 2.0 cee773705895 13 hours ago 231.2 MB my_centos 1.0 cee773705895 13 hours ago 231.2 MB 上面有三个关于centos的镜像其中my_centos:2.0和my_centos:1.0,使用的是centos镜像只是重新 打了标签。下面使用标签删除镜像。 [rootlocalhost ~]# docker rmi my_centos:2.0 Untagged: my_centos:2.0 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest cee773705895 13 hours ago 231.2 MB my_centos 1.0 cee773705895 13 hours ago 231.2 MB发现只有这个my_centos:2.0镜像会被删除其它标签的镜像并不会删除。2.使用镜像ID删除镜像使用镜像ID删除时会先删除所有指向该镜像的标签再删除该镜像文件本身。以上面的centos镜像为例使用镜像ID的方式来删除镜像。​​​​​​​[rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest cee773705895 13 hours ago 231.2 MB my_centos 1.0 cee773705895 13 hours ago 231.2 MB [rootlocalhost ~]# docker rmi -f cee773705895 Untagged: centos:latest Untagged: my_centos:1.0 Deleted: cee773705895f75ee1c8875c79051eb2f9dfff5095c43465460aa97d20028773 Deleted: dd60c9449c5fd97c81eda60d6b311a9879ddd37c020293f69c207fa00b38cbfb Deleted: 0363682f473075e9846bfb50ad6d90a0ee6080b208b49e425721ed14523fb43b 删除了centos:latest和my_centos:1.0两个标签的镜像06使用commit命令创建镜像通常创建Docker镜像有两种方法一是使用commit命令创建;二是使用dockerfile来文件来创建本节主要介绍如何使用commit命令来创建。可以将此想象为我们是在往版本控制系统里提交变更我们先创建一个容器并在容器里做出修改就像修改代码一样最后再将修改提交为一个新境像。使用commit创建境像的语法如下​​​​​​​docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] OPTIONS说明 -a :提交的镜像作者 -c :使用Dockerfile指令来创建镜像 -m :提交时的说明文字 -p :在commit时将容器暂停。 [rootlocalhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a545ce72d99 redis docker-entrypoint.s 2 weeks ago Up 2 seconds 0.0.0.0:6379-6379/tcp redis-test [rootlocalhost ~]# docker commit -a chuanshi.com -m my redis 9a545ce72d99 my_redis:v1.0 1faa62dd428ca588eef3493c509cf0393511457bd25498c75d10ee1921ee401f [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_redis v1.0 1faa62dd428c 9 seconds ago 105.4 MB下次分享docker容器的常见操作敬请关注