什么是镜像?

解释

考虑到容器是一个隔离的进程,它的文件和配置从何而来?你如何共享这些环境?

这时容器镜像就派上用场了。容器镜像是一个标准化打包的文件,包含运行容器所需的所有文件、二进制文件、库和配置。

对于一个 PostgreSQL 镜像,该镜像会打包数据库二进制文件、配置文件以及其他依赖项。对于一个 Python Web 应用,它将包含 Python 运行时、你的应用代码及其所有依赖项。

镜像有两个重要原则

  1. 镜像不可变。一旦镜像创建完成,就不能再修改。你只能创建一个新镜像或在现有镜像基础上添加更改。

  2. 容器镜像由层组成。每个层代表一组文件系统更改,它们添加、删除或修改文件。

这两个原则允许你在现有镜像基础上进行扩展或添加。例如,如果你正在构建一个 Python 应用,你可以从 Python 镜像 开始,然后添加额外的层来安装应用的依赖项并添加你的代码。这让你能专注于你的应用,而不是 Python 本身。

查找镜像

Docker Hub 是存储和分发镜像的默认全球市场。它拥有由开发者创建的超过 100,000 个镜像,你可以在本地运行它们。你可以在 Docker Desktop 中直接搜索 Docker Hub 镜像并运行。

Docker Hub 提供了各种由 Docker 支持和认可的镜像,被称为 Docker 可信内容。这些镜像提供完全托管的服务,或作为你创建自己镜像的绝佳起点。它们包括

例如,RedisMemcached 是一些流行的即用型 Docker 官方镜像。你可以下载这些镜像并在几秒钟内启动并运行这些服务。此外还有基础镜像,例如 Node.js Docker 镜像,你可以将其作为起点,然后添加你自己的文件和配置。

动手尝试


在本实践中,你将学习如何使用 Docker Desktop GUI 搜索和拉取(pull)容器镜像。

搜索并下载镜像

  1. 打开 Docker Desktop Dashboard,在左侧导航菜单中选择镜像视图。

    A screenshot of the Docker Desktop Dashboard showing the image view on the left sidebar
  2. 选择 Search images to run(搜索要运行的镜像)按钮。如果你没有看到它,选择屏幕顶部的全局搜索栏

    A screenshot of the Docker Desktop Dashboard showing the search ta
  3. 搜索字段中,输入 "welcome-to-docker"。搜索完成后,选择 docker/welcome-to-docker 镜像。

    A screenshot of the Docker Desktop Dashboard showing the search results for the docker/welcome-to-docker image
  4. 选择 Pull(拉取)以下载镜像。

了解镜像

下载镜像后,你可以通过 GUI 或 CLI 了解关于镜像的很多细节。

  1. 在 Docker Desktop Dashboard 中,选择镜像视图。

  2. 选择 docker/welcome-to-docker 镜像以打开有关该镜像的详细信息。

    A screenshot of the Docker Desktop Dashboard showing the images view with an arrow pointing to the docker/welcome-to-docker image
  3. 镜像详情页面会显示有关镜像层、镜像中安装的软件包和库以及发现的任何漏洞的信息。

    A screenshot of the image details view for the docker/welcome-to-docker image

按照说明使用 CLI 搜索和拉取 Docker 镜像并查看其层。

搜索并下载镜像

  1. 打开终端并使用 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 上可用相关镜像的信息。

  2. 使用 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
    

    每一行都代表镜像下载的一个层。请记住,每个层都是一组文件系统更改,提供了镜像的功能。

了解镜像

  1. 使用 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。

    镜像大小

    此处显示的镜像大小反映的是镜像的未压缩大小,而不是层的下载大小。

  2. 使用 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 镜像的层。

附加资源

以下资源将帮助你进一步了解如何探索、查找和构建镜像

下一步

现在你已经了解了镜像的基础知识,接下来是学习如何通过注册表分发镜像。

页面选项