什么是镜像?
解释
考虑到容器是一个隔离的进程,它的文件和配置从何而来?你如何共享这些环境?
这时容器镜像就派上用场了。容器镜像是一个标准化打包的文件,包含运行容器所需的所有文件、二进制文件、库和配置。
对于一个 PostgreSQL 镜像,该镜像会打包数据库二进制文件、配置文件以及其他依赖项。对于一个 Python Web 应用,它将包含 Python 运行时、你的应用代码及其所有依赖项。
镜像有两个重要原则
镜像不可变。一旦镜像创建完成,就不能再修改。你只能创建一个新镜像或在现有镜像基础上添加更改。
容器镜像由层组成。每个层代表一组文件系统更改,它们添加、删除或修改文件。
这两个原则允许你在现有镜像基础上进行扩展或添加。例如,如果你正在构建一个 Python 应用,你可以从 Python 镜像 开始,然后添加额外的层来安装应用的依赖项并添加你的代码。这让你能专注于你的应用,而不是 Python 本身。
查找镜像
Docker Hub 是存储和分发镜像的默认全球市场。它拥有由开发者创建的超过 100,000 个镜像,你可以在本地运行它们。你可以在 Docker Desktop 中直接搜索 Docker Hub 镜像并运行。
Docker Hub 提供了各种由 Docker 支持和认可的镜像,被称为 Docker 可信内容。这些镜像提供完全托管的服务,或作为你创建自己镜像的绝佳起点。它们包括
- Docker 官方镜像 - 一组精选的 Docker 仓库,是大多数用户的起点,也是 Docker Hub 上最安全的一些镜像
- Docker 认证发布商 - 由 Docker 认证的商业发布商提供的高质量镜像
- Docker 赞助的开源项目镜像 - 由 Docker 通过其开源计划赞助的开源项目发布和维护的镜像
例如,Redis 和 Memcached 是一些流行的即用型 Docker 官方镜像。你可以下载这些镜像并在几秒钟内启动并运行这些服务。此外还有基础镜像,例如 Node.js Docker 镜像,你可以将其作为起点,然后添加你自己的文件和配置。
动手尝试
在本实践中,你将学习如何使用 Docker Desktop GUI 搜索和拉取(pull)容器镜像。
搜索并下载镜像
打开 Docker Desktop Dashboard,在左侧导航菜单中选择镜像视图。
选择 Search images to run(搜索要运行的镜像)按钮。如果你没有看到它,选择屏幕顶部的全局搜索栏。
在搜索字段中,输入 "welcome-to-docker"。搜索完成后,选择
docker/welcome-to-docker
镜像。选择 Pull(拉取)以下载镜像。
了解镜像
下载镜像后,你可以通过 GUI 或 CLI 了解关于镜像的很多细节。
在 Docker Desktop Dashboard 中,选择镜像视图。
选择 docker/welcome-to-docker 镜像以打开有关该镜像的详细信息。
镜像详情页面会显示有关镜像层、镜像中安装的软件包和库以及发现的任何漏洞的信息。
按照说明使用 CLI 搜索和拉取 Docker 镜像并查看其层。
搜索并下载镜像
打开终端并使用
docker search
命令搜索镜像docker search docker/welcome-to-docker
你将看到如下输出
NAME DESCRIPTION STARS OFFICIAL docker/welcome-to-docker Docker image for new users getting started w… 20
此输出显示了 Docker Hub 上可用相关镜像的信息。
使用
docker pull
命令拉取镜像。docker pull docker/welcome-to-docker
你将看到如下输出
Using default tag: latest latest: Pulling from docker/welcome-to-docker 579b34f0a95b: Download complete d11a451e6399: Download complete 1c2214f9937c: Download complete b42a2f288f4d: Download complete 54b19e12c655: Download complete 1fb28e078240: Download complete 94be7e780731: Download complete 89578ce72c35: Download complete Digest: sha256:eedaff45e3c78538087bdd9dc7afafac7e110061bbdd836af4104b10f10ab693 Status: Downloaded newer image for docker/welcome-to-docker:latest docker.io/docker/welcome-to-docker:latest
每一行都代表镜像下载的一个层。请记住,每个层都是一组文件系统更改,提供了镜像的功能。
了解镜像
使用
docker image ls
命令列出已下载的镜像docker image ls
你将看到如下输出
REPOSITORY TAG IMAGE ID CREATED SIZE docker/welcome-to-docker latest eedaff45e3c7 4 months ago 29.7MB
此命令显示你系统上当前可用的 Docker 镜像列表。
docker/welcome-to-docker
的总大小约为 29.7MB。镜像大小
此处显示的镜像大小反映的是镜像的未压缩大小,而不是层的下载大小。
使用
docker image history
命令列出镜像的层docker image history docker/welcome-to-docker
你将看到如下输出
IMAGE CREATED CREATED BY SIZE COMMENT 648f93a1ba7d 4 months ago COPY /app/build /usr/share/nginx/html # buil… 1.6MB buildkit.dockerfile.v0 <missing> 5 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 5 months ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 5 months ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B <missing> 5 months ago /bin/sh -c #(nop) COPY file:9e3b2b63db9f8fc7… 4.62kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:57846632accc8975… 3.02kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:3b1b9915b7dd898a… 298B <missing> 5 months ago /bin/sh -c #(nop) COPY file:caec368f5a54f70a… 2.12kB <missing> 5 months ago /bin/sh -c #(nop) COPY file:01e75c6dd0ce317d… 1.62kB <missing> 5 months ago /bin/sh -c set -x && addgroup -g 101 -S … 9.7MB <missing> 5 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1 0B <missing> 5 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.25.3 0B <missing> 5 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 5 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 5 months ago /bin/sh -c #(nop) ADD file:ff3112828967e8004… 7.66MB
此输出显示所有层、它们的大小以及用于创建该层的命令。
查看完整命令
如果你向命令添加
--no-trunc
标志,你将看到完整的命令。请注意,由于输出采用表格格式,较长的命令会使输出难以浏览。
在本演练中,你搜索并拉取了一个 Docker 镜像。除了拉取 Docker 镜像外,你还了解了 Docker 镜像的层。
附加资源
以下资源将帮助你进一步了解如何探索、查找和构建镜像
下一步
现在你已经了解了镜像的基础知识,接下来是学习如何通过注册表分发镜像。