构建、标记并发布镜像

说明

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

  • 构建镜像 - 基于 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 的公共注册中心 docker.io
  • PORT_NUMBER:如果提供了主机名,则为注册中心端口号
  • PATH:镜像的路径,由斜杠分隔的组件组成。对于 Docker Hub,格式为 [NAMESPACE/]REPOSITORY,其中 namespace 是用户或组织的名称。如果未指定 namespace,则使用 library,它是 Docker 官方镜像的命名空间。
  • TAG:一个自定义的、人类可读的标识符,通常用于标识镜像的不同版本或变体。如果未指定 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 标志

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

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

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

发布镜像

构建并标记好镜像后,你就可以将其推送到注册中心了。为此,请使用 docker push 命令。

docker push my-username/my-image

几秒钟内,你的镜像所有层将被推送到注册中心。

需要认证

在将镜像推送到仓库之前,你需要进行认证。为此,只需使用 docker login 命令。

试一试

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

设置

  1. 获取示例应用。

    如果你安装了 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 命令查看镜像的历史记录(或创建方式)。

    $ 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 命令推送镜像。

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

    如果收到 requested access to the resource is denied (请求的资源访问被拒绝)错误,请确保你已登录且镜像标签中的 Docker 用户名正确。

    稍等片刻,你的镜像应该就会被推送到 Docker Hub。

更多资源

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

下一步

现在你已经学习了构建和发布镜像,接下来是学习如何使用 Docker 构建缓存来加快构建过程。

页面选项