构建、标记并发布镜像
说明
在本指南中,你将学习以下内容
- 构建镜像 - 基于
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。
设置
获取示例应用。
如果你安装了 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 构建缓存来加快构建过程。