Skip to content

构建、标记和发布镜像

原文:https://docs.docker.com/guides/docker-concepts/building-images/build-tag-and-publish-an-image/

解释

在本指南中,您将学习以下内容:

  • 构建镜像 - 基于Dockerfile构建镜像的过程
  • 标记镜像 - 给镜像命名的过程,这也决定了镜像可以被分发的位置
  • 发布镜像 - 使用容器镜像仓库分发或共享新创建的镜像的过程

构建镜像

通常,镜像是使用 Dockerfile 构建的。最基本的docker build命令可能如下所示:

bash
docker build .

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

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

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

console
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

有了上述输出,您可以使用引用的镜像启动容器:

console
docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00

这个名称显然不容易记住,这就是标记变得有用的地方。

标记镜像

标记镜像是为镜像提供一个易记名称的方法。然而,镜像名称有一定的结构:

text
[HOST[:PORT_NUMBER]/]PATH[:TAG]
  • HOST: 可选的镜像仓库主机名,位于镜像所在位置。如果没有指定主机,默认使用 Docker 的公共镜像仓库docker.io
  • PORT_NUMBER: 如果提供了主机名,则为镜像仓库端口号
  • PATH: 镜像的路径,由斜杠分隔的组件组成。对于 Docker Hub,格式遵循[NAMESPACE/]REPOSITORY,其中 namespace 是用户或组织的名称。如果没有指定命名空间,将使用library,这是 Docker

官方镜像的命名空间。

  • TAG: 一个自定义的、人类可读的标识符,通常用于标识镜像的不同版本或变体。如果没有指定标签,默认使用latest

一些镜像名称的例子包括:

  • nginx, 等同于docker.io/library/nginx:latest:这会从docker.io镜像仓库、library命名空间、nginx镜像库和latest标签中拉取镜像。
  • docker/welcome-to-docker, 等同于docker.io/docker/welcome-to-docker:latest:这会从docker.io镜像仓库、docker命名空间、welcome-to-docker镜像库和latest标签中拉取镜像。
  • ghcr.io/dockersamples/example-voting-app-vote:pr-311:这会从 GitHub 容器镜像仓库、dockersamples命名空间、example-voting-app-vote镜像库和pr-311标签中拉取镜像。

在构建过程中标记镜像,添加-t--tag标志:

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

如果您已经构建了一个镜像,您可以使用docker image tag命令为镜像添加另一个标签:

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

发布镜像

一旦您构建并标记了镜像,就准备好将其推送到镜像仓库了。为此,请使用docker push命令:

console
docker push my-username/my-image

几秒钟内,您的镜像的所有层将被推送到镜像仓库。

需要认证

在您能够将镜像推送到存储库之前,您需要进行认证。 为此,请简单使用docker login命令。

试一试

在这个动手指南中,您将使用提供的 Dockerfile 构建一个简单的镜像并将其推送到 Docker Hub。

设置

  1. 获取示例应用程序。

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

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

    console
    git clone https://github.com/docker/getting-started-todo-app
  2. 下载并安装 Docker 桌面版。

  3. 如果您还没有 Docker 账户,现在创建一个。完成后,请使用该账户登录 Docker 桌面版。

构建镜像

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

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

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

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

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

    console
    docker image ls

    命令将产生类似以下的输出:

    plaintext
    REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
    mobywhale/concepts-build-image-demo    latest    746c7e06537f   24 seconds ago   354MB
  3. 您实际上可以使用docker image history命令查看镜像的历史(或如何创建镜像):

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

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

    plaintext
    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命令推送镜像:

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

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

    一会儿后,您的镜像应该被推送到 Docker Hub。

额外资源

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