构建、标记和发布图像
解释
在本指南中,您将了解以下内容:
- 构建图像 - 基于图像构建图像的过程
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.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
dockersamples
:这会从 GitHub 容器注册表、命名空间、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 构建缓存来加速构建过程了。