构建、标记和发布镜像
解释
在本指南中,您将学习以下内容
- 构建镜像 - 基于 `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`,其中命名空间是用户的或组织的名称。如果没有指定命名空间,则使用 `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` 标志
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。
设置
获取示例应用程序。
如果您有 Git,可以克隆示例应用程序的存储库。否则,您可以下载示例应用程序。请选择以下选项之一。
在终端中使用以下命令克隆示例应用程序存储库。
$ git clone https://github.com/docker/getting-started-todo-app
下载源代码并解压缩。
下载并安装 Docker Desktop。
如果您还没有 Docker 帐户,请立即创建一个。完成此操作后,使用该帐户登录 Docker Desktop。
构建镜像
现在您已经在 Docker Hub 上拥有了一个存储库,现在是构建镜像并将其推送到存储库的时候了。
在示例应用程序存储库的根目录中使用终端,运行以下命令。将 `YOUR_DOCKER_USERNAME` 替换为您的 Docker Hub 用户名
$ docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo .
例如,如果您的用户名是 `mobywhale`,您将运行以下命令
$ docker build -t mobywhale/concepts-build-image-demo .
构建完成后,您可以使用以下命令查看镜像
$ docker image ls
该命令将产生类似于以下内容的输出
REPOSITORY TAG IMAGE ID CREATED SIZE mobywhale/concepts-build-image-demo latest 746c7e06537f 24 seconds ago 354MB
实际上,您可以使用 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
此输出显示了镜像的层,突出显示了您添加的层以及从基础镜像继承的层。
推送镜像
现在您已经构建了镜像,现在是将其推送到注册表的时候了。
使用 docker push 命令推送镜像
$ docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
如果您收到 `requested access to the resource is denied` 错误,请确保您已登录,并且镜像标记中的 Docker 用户名正确。
片刻之后,您的镜像应该被推送到 Docker Hub。
其他资源
要详细了解构建、标记和发布镜像,请访问以下资源
下一步
现在您已经了解了如何构建和发布镜像,是时候学习如何使用 Docker 构建缓存来加速构建过程了。