什么是镜像?

解释

看到一个 容器 是一个隔离的进程,它从哪里获取其文件和配置?你如何共享这些环境?

这就是容器镜像发挥作用的地方!

容器镜像是一个标准化包,其中包含运行容器所需的所有文件、二进制文件、库和配置。

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

镜像有两个重要原则

  1. 镜像是不可变的。一旦创建镜像,就无法修改。你只能创建一个新的镜像或在它之上添加更改。

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

这两个原则使您可以扩展或添加到现有镜像。例如,如果您正在构建 Python 应用程序,您可以从 Python 镜像 开始,并添加额外的层来安装您的应用程序的依赖项并添加您的代码。这使您可以专注于您的应用程序,而不是 Python 本身。

查找镜像

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

Docker Hub 提供各种 Docker 支持和认可的镜像,称为 Docker 可信内容。这些提供完全托管的服务或为您的镜像提供出色的起点。这些包括

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

试一试


在这个动手操作中,您将学习如何使用 Docker Desktop GUI 搜索和拉取容器镜像。

搜索并下载镜像

  1. 打开 Docker Dashboard 并选择左侧导航菜单中的“镜像”视图。

    A screenshot of the Docker Dashboard showing the image view on the left sidebar
  2. 选择“搜索要运行的镜像”按钮。如果您没有看到它,请选择屏幕顶部的“全局搜索栏”。

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

    A screenshot of the Docker Dashboard showing the search results for the docker/welcome-to-docker image
  4. 选择“拉取”下载镜像。

了解镜像

下载镜像后,您可以通过 GUI 或 CLI 了解有关镜像的大量详细信息。

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

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

    A screenshot of the Docker 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 镜像的层。

其他资源

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

下一步

现在您已经了解了镜像的基础知识,是时候学习通过注册表分发镜像了。