ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

《Docker技术入门与实战 第4版》阅读笔记 2 Docker 镜像

《Docker技术入门与实战 第4版》阅读笔记 2 Docker 镜像 《Docker技术入门与实战 第4版》阅读笔记 2 Docker 镜像第3章 使用 Docker 镜像在书中以 $ 开头的命令表示普通用户以 # 开头的命令表示 root 用户需要在命令前使用 sudo 临时提升权限。3.1 获取镜像我截图演示的就是需要掌握的我没截图演示的了解即可。可以使用 docker[image]pull 命令直接从镜像源来下载镜像该命令的格式为 docker[image]pull NAME[:TAG]​。其中NAME 是镜像仓库的名称用来区分镜像​TAG 是镜像的标签往往用来表示版本信息​。通常情况下描述一个镜像需要包括名称和标签信息。例如要获取一个 Ubuntu 24.04 系统的基础镜像可以使用如下命令dockerpull ubuntu:24.04对于 Docker 镜像来说如果不显式指定 TAG则默认会选择 latest 标签下载仓库中最新版本的镜像。dockerpull ubuntu# 等于dockerpull ubuntu:latest镜像的 latest 标签意味着该镜像是最新版本因此版本并不稳定。为了确保生产环境的稳定性建议避免忽略镜像的标签信息和使用默认的latest标记的镜像。在使用 docker pull 命令下载镜像时会发现镜像文件通常由多个层 (layer) 组成。类似 966c395d29cb 的字符串是层的唯一ID实际上完整的 ID 由256位即 64 个十六进制字符组成​。下载过程中命令行会显示镜像的各个层信息。若不同的镜像包含相同的层则本地仅存储一份该层的内容从而减少了存储空间的占用。不同的镜像仓库服务器上镜像重名怎么办镜像的仓库名称应当包含仓库地址作为前缀。前缀可以省略使用默认的仓库地址。dockerpull ubuntu:24.04# 等同于dockerpull 默认仓库地址/ubuntu:24.04Docker 自 1.3.0 版本起对镜像管理引入了签名系统可以通过比对签名来验证镜像的完整性加强了镜像的安全性。pull 子命令支持的选项主要包括-a或 --all-tagstrue|false# 是否获取仓库中的所有标签默认为否。--disable-content-trusttrue|false# 取消镜像的内容校验默认为真。有时需要使用镜像代理服务来加速 Docker 镜像获取过程可以在 Docker 服务启动配置中增加 --registry-mirrorproxy_URL 来指定镜像代理服务地址​。阿里云服务器已经帮我们配置好了镜像代理服务。下载镜像到本地后利用该镜像创建一个容器在其中运行 bash 应用执行打印 “Hello World” 的命令dockerrun-itubuntu:24.04echoHello Worldexit使用代理服务器下载镜像当需要通过代理服务器下载外网镜像时可以通过修改 Docker 配置文件重启 Docker 服务后生效。Ubuntu 系统中的配置文件路径为 /lib/systemd/system/docker.service。代理协议可以使用 Socks5、HTTP、HTTPS 等。NO_PROXY 可以指定不用代理服务器的仓库地址范围。3.2 查看镜像信息1.使用 images 命令列出镜像使用 docker images 或 docker image ls 命令可以列出本地主机上已有镜像的基本信息。dockerimages# 或dockerimagelsREPOSITORYTAGIMAGE IDCREATEDSIZE镜像所属的仓库镜像的版本信息镜像的唯一标识镜像最后一次更新的时间镜像的体积大小镜像 ID 唯一标识了一个镜像。在使用镜像 ID 时通常可以使用该 ID 前几个字符组成的可区分子串来代替完整的ID。标签信息用于区分来自同一个仓库的不同镜像。例如在 Ubuntu 仓库中可以通过不同的标签如24.04、17.10等来区分各个发行版本。镜像大小信息仅表示镜像的逻辑体积大小。实际上由于相同的镜像层在本地只会存储一份因此所有的镜像物理上占用的存储空间之和通常小于镜像逻辑体积之和。docker images 子命令支持许多选项-a或--alltrue|false#列出所有镜像文件默认为否。--digeststrue|false#列出镜像的数字摘要值默认为否。-f或--filter[​]​#过滤要列出的镜像例如使用danglingtrue只显示未被使用的镜像也可以指定带有特定标签的镜像等。--formatTEMPLATE#自定义输出格式包括table、json、Go模板格式等。--no-trunctrue|false#设置是否对过长的输出结果进行截断例如镜像的ID信息默认为是。-q或--quiettrue|false#仅输出ID信息默认为否。更多子命令选项还可以通过 docker images --help 命令查看。2.使用 tag 命令添加镜像标签可以使用 docker tag 命令为本地镜像添加新的标签。例如添加一个新的 myubuntu:latest 镜像标签dockertag ubuntu:24.04 myubuntu:latest再次使用 docker images 列出本地镜像信息可以看到多了一个 myubuntu:latest 标签的镜像注意myubuntu:latest 镜像和 ubuntu:latest 镜像的 ID 是完全一致的它们实际上指向了同一个镜像文件只是别名不同而已。docker tag 命令添加的标签实际上起到了软链接的作用。dockerimages3.使用 inspect 命令查看详细信息使用 docker [image] inspect 命令可以获取该镜像的详细信息包括制作者、适用架构、各层的数字摘要等返回的是一个 JSON 格式的消息如果只需要其中一项内容时可以使用 -f 来指定例如获取镜像的 Architecturedockerinspect ubuntu:24.04dockerinspect-f{{.Architecture}}ubuntu:24.044.使用 history 命令查看镜像历史既然镜像文件由多个层组成那么怎么知道各个层的内容具体是什么这时可以使用 history 子命令该命令将列出各层的创建信息。注意过长的命令被自动截断了可以使用 --no-trunc 选项来输出完整命令。dockerhistoryubuntu:24.04dockerhistoryubuntu:24.04 --no-trunc3.3 搜寻镜像使用 docker search 命令可以搜索 Docker Hub 官方仓库中的镜像命令格式为 docker search [option] keyword。支持的选项主要包括-f或--filterfilter#过滤输出内容。--formatstring#格式化输出内容。--limitint#限制输出结果个数默认为25个。--no-trunc#不截断输出结果。例如搜索带 nginx 关键字的镜像命令如下dockersearch--filteris-officialtrue nginx再比如搜索所有收藏数超过 4 的关键词包括 tensorflow 的镜像命令如下dockersearch--filterstars4tensorflow默认的输出结果将按照星级评价进行排序。3.4 删除和清理镜像1.使用标签删除镜像使用 docker rmi 或 docker image rm 命令可以删除镜像命令格式为 docker rmi [OPTIONS] IMAGE [IMAGE…]​其中 IMAGE 可以为标签或ID。支持的选项包括-f或--force#强制删除镜像即使有容器依赖它。--no-prune#不要清理未带标签的父镜像。例如创建一个新的 myubuntu:latest 镜像标签然后删除它可以使用如下命令dockerimages# 查看镜像已经加过标签 myubuntu:latest 了。# docker tag ubuntu:24.04 myubuntu:latestdockerrmi myubuntu:latest本地的 ubuntu:24.04 镜像不会受到此命令的影响。当同一个镜像拥有多个标签时docker rmi 命令只是删除了该镜像多个标签中的指定标签而已并不影响镜像文件。因此上述操作只是删除了镜像的一个标签副本。但当镜像只剩下一个标签时就要小心了此时再使用 docker rmi 命令会删除镜像标签和数据文件。再次查看本地的镜像发现 ubuntu:24.04 镜像仍然存在2.使用镜像 ID 来删除镜像当使用 docker rmi 命令并且后面跟上镜像的 ID或能进行区分的部分前缀时会先尝试删除所有指向该镜像的标签然后删除该镜像文件本身。注意当存在通过该镜像创建的容器时镜像文件默认是无法被删除的。使用 docker ps -a 命令可以看到本机上存在的所有容器可以看到后台存在一个退出状态的容器是基于 ubuntu:24.04 镜像创建的。如果试图删除该镜像Docker 会提示有容器正在运行无法删除如果要想强行删除镜像可以使用 -f 参数注意不推荐使用 -f 参数来强制删除一个存在容器依赖的镜像。正确的做法是先删除依赖该镜像的所有容器再来删除镜像。dockerrmi ubuntu:24.04首先删除容器然后使用镜像 ID 删除镜像此时会正常打印出删除的各层信息dockerrm容器iddockerrmi 镜像id3.清理镜像使用 Docker 一段时间后系统中可能会遗留一些临时的镜像文件以及一些没有被使用的镜像此时可以通过 docker image prune 命令进行清理。支持的选项包括-a或--all#删除所有无用镜像不仅是临时镜像。--filterfilter#只清理符合给定过滤器的镜像。-f或--force#强制删除镜像而不进行提示确认。例如如下命令会自动清理临时的遗留镜像文件层最后会提示释放的存储空间dockerimage prune-f3.5 创建镜像创建镜像的方法主要有三种基于已有镜像的容器创建基于归档文件导入基于Dockerfile创建1.基于已有镜像的容器创建该方法主要是使用 docker commit 命令命令格式为dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]主要选项包括-a或--author#作者信息。-c或--change[​]​#提交的时候执行 Dockerfile 指令包括CMD|ENTRYPOINT|E NV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等。-m或--message#提交消息。-p或--pausetrue#提交时暂停容器运行。首先启动一个镜像并在其中进行修改操作。例如创建一个 test 文件之后退出代码如下dockerrun-itubuntu:24.04 /bin/bashtouchtestexit此时该容器与原 ubuntu:24.04 镜像相比已经发生了改变可以使用 docker commit 命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器此时查看本地镜像列表会发现新创建的镜像已经存在了dockercommit-mAdd a new file-ayangjunbo容器id test:0.1dockerimages2.基于归档文件导入用户也可以直接从一个归档文件文件导入一个镜像主要使用 docker [image] import 命令命令格式为dockerimport[OPTIONS]file|URL|-[REPOSITORY[:TAG]]# file|URL|- 支持直接指定文件路径或 URL 或 -表示从标准输入读取。# 从标准输入读取通过管道导入cat archive.tar | docker import -该命令主要是从容器的归档文件中进行导入形成一个新的镜像。例如将任何容器导出为本地归档文件然后使用 import 命令导入即可dockerps-a# 查看所有容器的信息# docker export [OPTIONS] CONTAINER# docker export -o output.tar CONTAINER# docker export CONTAINER output.tardockerexport-otest.tar 容器id# 将容器导出为本地归档文件dockerimageimporttest.tar test/ubuntu:v1docker export 和 docker container export 是完全相同的命令没有任何功能区别。3.基于 Dockerfile 创建基于 Dockerfile 创建镜像是最常见的方式。Dockerfile 是一个文本文件其中包括了指令描述基于某个父镜像创建新镜像的过程。Dockerfile 文件的细节将在后面进行介绍。touchDockerfile# 创建 Dockerfile 文件viDockerfile# 编辑 Dockerfile 文件在其中写创建镜像的步骤。dockerbuild-ttest/python:3.# 安装 Dockerfile 文件开始构建镜像3.6 导出和载入镜像通过运行 docker image save 和 docker image load 命令来分别保存和加载镜像。通过这种方式可以传输和共享 Docker 镜像为应用部署提供便利。1.导出镜像若要将镜像导出到本地文件可使用 docker image save 命令。此命令支持 -o 或 --output string 参数可将镜像导出到指定文件。例如要将本地的 ubuntu:24.04 镜像导出为 ubun_24.04.tar 文件请执行以下操作完成此操作后用户便可通过复制 ubuntu_24.04.tar 文件将该镜像与他人共享。dockerimages# 查看镜像# docker save [OPTIONS] IMAGE [IMAGE...]dockersave-oubuntu_v1.tar test/ubuntu:v12.载入镜像可以使用 docker load 命令将导出的 tar 文件再导入为本地镜像。该命令支持 -i,–input string 选项允许从指定文件中读入镜像内容。例如若要从名为 ubuntu_24.04.tar 的文件导入镜像到本地镜像列表请按照以下方式操作执行这些命令将导入镜像及其相关的元数据信息包括标签等。导入成功后可以使用 docker images 命令查看本地镜像列表会发现刚刚导入的镜像与原镜像完全相同。dockerload-iubuntu_v1.tar# 或dockerloadubuntu_v1.tar3.7 上传镜像国内默认无法连接 DockerHub 官方仓库不演示截图了了解即可。要将镜像上传至仓库用户可以使用 docker image push 命令。默认情况下镜像将被上传至 Docker Hub 官方仓库。如果用户没有 Docker Hub 账号需要先注册账号。命令的格式为dockerimage push[OPTIONS]NAME[:TAG]|[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]在 Docker Hub 网站上注册并登录后便可以上传自己创建的镜像。以用户 user 为例假设想要上传本地的 test:latest 镜像。首先需要为其添加一个以用户名为前缀的标签如 user/test:latest然后使用 docker image push 命令上传镜像首次上传时会提示输入自己在 Docker Hub 的登录信息或进行注册之后登录信息会记录到本地的/.docker目录下后续上传时无须再次登录。dockertag test:latest user/test:latestdockerpush user/test:latestdocker push 是 docker image push 的简写别名两者完全等价。3.8 本章小结用户可以通过输入 docker image help 命令查阅 Docker 支持的各种镜像操作子命令。
返回列表