什么是镜像?

说明

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

这就是容器镜像发挥作用的地方。容器镜像是一个标准化的软件包,包含了运行容器所需的所有文件、Binaries、库和配置。

对于 PostgreSQL 镜像,该镜像将打包数据库Binaries、配置文件以及其他依赖项。对于 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 图形界面搜索和拉取容器镜像。

搜索并下载镜像

  1. 打开 Docker Desktop 仪表板,然后在左侧导航菜单中选择 镜像 视图。

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

    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. 选择 拉取 以下载镜像。

了解镜像

一旦您下载了镜像,您可以通过 GUI 或 CLI 了解关于该镜像的许多详细信息。

  1. 在 Docker Desktop 仪表板中,选择镜像视图。

  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

按照说明使用命令行界面搜索并拉取 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 镜像的分层结构。

其他资源

以下资源将帮助您了解更多关于探索、查找和构建镜像的信息:

后续步骤

既然您已经了解了镜像的基础知识,现在该学习如何通过注册表分发镜像了。