Docker教程 · 2024年11月11日

构建、标记和发布图像

构建、标记和发布图像

在本指南中,您将了解以下内容:

  • 构建图像 – 基于图像构建图像的过程Dockerfile
  • 标记图像 – 给图像命名的过程,这也决定了图像可以分发到的位置
  • 发布镜像 – 使用容器注册表分发或共享新创建的镜像的过程

大多数情况下,图像是使用 Dockerfile 构建的。最基本的docker build命令可能如下所示:


docker build .

.命令中的 最后一个提供了的路径或 URL 。在此位置,构建器将找到Dockerfile和其他引用的文件。

当您运行构建时,构建器会根据需要拉取基础映像,然后运行 ​​Dockerfile 中指定的指令。

使用前面的命令,图像将没有名称,但输出将提供图像的 ID。例如,前面的命令可能会产生以下输出:


$ docker build . [+] Building 3.5s (11/11) FINISHED docker:desktop-linux  => [internal] load build definition from Dockerfile 0.0s  => => transferring dockerfile: 308B 0.0s  => [internal] load metadata for docker.io/library/python:3.12 0.0s  => [internal] load .dockerignore 0.0s  => => transferring context: 2B 0.0s  => [1/6] FROM docker.io/library/python:3.12 0.0s  => [internal] load build context 0.0s  => => transferring context: 123B 0.0s  => [2/6] WORKDIR /usr/local/app 0.0s  => [3/6] RUN useradd app 0.1s  => [4/6] COPY ./requirements.txt ./requirements.txt 0.0s  => [5/6] RUN pip install --no-cache-dir --upgrade -r requirements.txt 3.2s  => [6/6] COPY ./app ./app 0.0s  => exporting to image 0.1s  => => exporting layers 0.1s  => => writing image sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00 0.0s 

通过前面的输出,您可以使用引用的图像启动容器:


docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00 

这个名字肯定不好记,这就是标签发挥作用的地方。

标记图像是为图像提供易于记忆的名称的方法。然而,图像的名称有一个结构。完整的图像名称具有以下结构:


[HOST[:PORT_NUMBER]/]PATH[:TAG]
  • HOST:映像所在的可选注册表主机名。如果未指定主机,则docker.io默认使用 Docker 的公共注册表。
  • PORT_NUMBER:如果提供了主机名,则为注册表端口号
  • PATH:图像的路径,由斜线分隔的部分组成。对于 Docker Hub,格式如下[NAMESPACE/]REPOSITORY,其中命名空间是用户或组织的名称。如果没有指定命名空间,library则使用 ,这是 Docker 官方镜像的命名空间。
  • TAG:一种自定义的、人类可读的标识符,通常用于识别图像的不同版本或变体。如果没有指定标签,则latest默认使用。

图像名称的一些示例包括:

  • nginx,相当于:这会从注册表、命名空间、镜像存储库和标签中docker.io/library/alpine:latest提取镜像。docker.iolibrarynginxlatest
  • docker/welcome-to-docker,相当于:从注册表、命名空间、镜像存储库和标签中docker.io/docker/welcome-to-docker:latest提取镜像docker.iodockerwelcome-to-dockerlatest
  • ghcr.io/dockersamples/example-voting-app-vote:pr-311dockersamples:这会从 GitHub 容器注册表、命名空间、example-voting-app-vote镜像存储库和pr-311标签中提取镜像

要在构建期间标记图像,请添加-t--tag标志:


docker build -t my-username/my-image . 

如果您已经构建了图像,则可以使用以下 命令向图像添加另一个标签:


docker image tag my-username/my-image another-username/another-image:v1 

构建并标记映像后,您就可以将其推送到注册表。为此,请使用以下 命令:


docker push my-username/my-image 

几秒钟之内,图像的所有层都将被推送到注册表。

需要身份验证

在您能够将图像推送到存储库之前,您需要经过身份验证。为此,只需使用 命令即可。

在本实践指南中,您将使用提供的 Dockerfile 构建一个简单的映像并将其推送到 Docker Hub。

  1. 获取示例应用程序。

    如果您有 Git,则可以克隆示例应用程序的存储库。否则,您可以下载示例应用程序。选择以下选项之一。

    使用 git 克隆 下载


    在终端中使用以下命令来克隆示例应用程序存储库。

    $ git clone https://github.com/docker/getting-started-todo-app 

    下载源代码并解压。


  2. Docker Desktop。

  3. 如果您还没有 Docker 帐户, 。完成此操作后,使用该帐户登录 Docker Desktop。

现在您在 Docker Hub 上有了一个存储库,是时候构建一个映像并将其推送到存储库了。

  1. 使用示例应用程序存储库根目录中的终端,运行以下命令。替换YOUR_DOCKER_USERNAME为您的 Docker Hub 用户名:

    $ docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo . 

    例如,如果您的用户名是mobywhale,您将运行以下命令:

    $ docker build -t mobywhale/concepts-build-image-demo . 
  2. 构建完成后,您可以使用以下命令查看图像:

    $ docker image ls 

    该命令将产生类似于以下内容的输出:

    REPOSITORY TAG IMAGE ID CREATED SIZE mobywhale/concepts-build-image-demo latest 746c7e06537f 24 seconds ago 354MB
  3. 命令查看历史记录(或图像的创建方式) :

    $ docker image history mobywhale/concepts-build-image-demo 

    然后您将看到类似于以下内容的输出:

    IMAGE CREATED CREATED BY SIZE COMMENT f279389d5f01 8 seconds ago CMD ["node" "./src/index.js"] 0B buildkit.dockerfile.v0 <missing> 8 seconds ago EXPOSE map[3000/tcp:{}] 0B buildkit.dockerfile.v0 <missing> 8 seconds ago WORKDIR /app 8.19kB buildkit.dockerfile.v0 <missing> 4 days ago /bin/sh -c #(nop) CMD ["node"] 0B <missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B <missing> 4 days ago /bin/sh -c #(nop) COPY file:4d192565a7220e13… 20.5kB <missing> 4 days ago /bin/sh -c apk add --no-cache --virtual .bui… 7.92MB <missing> 4 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.22.19 0B <missing> 4 days ago /bin/sh -c addgroup -g 1000 node && addu… 126MB <missing> 4 days ago /bin/sh -c #(nop) ENV NODE_VERSION=20.12.0 0B <missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:d0764a717d1e9d0af… 8.42MB

    此输出显示图像的图层,突出显示您添加的图层以及从基础图像继承的图层。

现在您已经构建了映像,是时候将该映像推送到注册表了。

  1. 命令推送镜像 :

    $ docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demo 

    如果您收到requested access to the resource is denied,请确保您已登录并且镜像标签中的 Docker 用户名正确。

    片刻之后,您的镜像应该会被推送到 Docker Hub。

要了解有关构建、标记和发布图像的更多信息,请访问以下资源:

现在您已经了解了如何构建和发布映像,是时候学习如何使用 Docker 构建缓存来加速构建过程了。