构建、标记并发布镜像
说明
在本指南中,您将学习以下内容:
- 构建镜像 - 基于
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,可以克隆示例应用程序的仓库。否则,可以下载示例应用程序。选择以下选项之一。
下载并安装 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 构建缓存来加速构建过程了。