构建、标记和发布镜像
解释
在本指南中,您将了解以下内容:
- 构建镜像 - 基于
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 是用户的名称或组织的名称。如果未指定命名空间,则library
,这是 Docker 官方镜像的命名空间。TAG
:一种自定义的、人类可读的标识符,通常用于标识镜像的不同版本或变体。如果未指定 tag,latest
默认使用。
镜像名称的一些示例包括:
nginx
,相当于docker.io/library/nginx:latest
:这会从docker.io
注册表中,使用library
命名空间、nginx
image 仓库和latest
标记。docker/welcome-to-docker
,相当于docker.io/docker/welcome-to-docker:latest
:这会从docker.io
注册表中,使用docker
命名空间、welcome-to-docker
image 仓库和latest
标记ghcr.io/dockersamples/example-voting-app-vote:pr-311
:这会从 GitHub Container Registry 中提取一个镜像,而dockersamples
命名空间、example-voting-app-vote
image 仓库和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 用户名在 image 标记中正确无误。片刻之后,您的镜像应该被推送到 Docker Hub。
其他资源
要了解有关构建、标记和发布镜像的更多信息,请访问以下资源:
后续步骤
现在,您已经了解了如何构建和发布镜像,是时候学习如何使用 Docker 构建缓存来加快构建过程了。