构建、标记和发布镜像

构建、标记和发布镜像

目录

  • 构建镜像
  • 标记镜像
  • 发布镜像
  • 实践
    • 设置
    • 构建镜像
    • 推送镜像

在本指南中,您将学习以下内容:

  • 构建镜像:基于Dockerfile构建镜像的过程。
  • 标记镜像:为镜像命名的过程,这也决定了镜像的分发位置。
  • 发布镜像:使用容器注册表分发或共享新创建的镜像的过程。

构建镜像

通常情况下,镜像是使用Dockerfile构建的。最基本的构建命令如下:

sh 复制代码
docker build .

命令中的.提供了构建上下文的路径或URL。在这个位置,构建器会找到Dockerfile和其他引用的文件。

当您运行构建时,构建器会拉取基础镜像(如果需要),然后运行Dockerfile中指定的指令。

使用上述命令,镜像将没有名称,但输出会提供镜像的ID。例如,前面的命令可能产生如下输出:

sh 复制代码
docker build .
[+] Building 3.5s (11/11) FINISHED
 => [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

根据上述输出,您可以使用引用的镜像启动一个容器:

sh 复制代码
docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00

这种名称肯定不好记,这时候标记镜像就变得很有用。

标记镜像

标记镜像是给镜像一个易记名称的方法。不过,镜像的名称有一定的结构。一个完整的镜像名称有以下结构:

sh 复制代码
[HOST[:PORT_NUMBER]/]PATH[:TAG]
  • HOST:镜像所在的可选注册表主机名。如果没有指定主机名,默认为Docker的公共注册表docker.io
  • PORT_NUMBER:如果提供了主机名,则为注册表端口号。
  • PATH:镜像的路径,由斜杠分隔的组件组成。对于Docker Hub,格式为[NAMESPACE/]REPOSITORY,其中namespace是用户或组织的名称。如果未指定namespace,则使用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 Container Registry、dockersamples命名空间、example-voting-app-vote镜像仓库中拉取pr-311标签的镜像。

在构建期间标记镜像,可以添加-t--tag标志:

sh 复制代码
docker build -t my-username/my-image .

如果您已经构建了镜像,可以使用docker image tag命令添加另一个标签:

sh 复制代码
docker image tag my-username/my-image another-username/another-image:v1

发布镜像

构建并标记好镜像后,您就可以将其推送到注册表。使用docker push命令:

sh 复制代码
docker push my-username/my-image

在几秒钟内,镜像的所有层都将被推送到注册表。

需要认证

在推送镜像到仓库之前,您需要进行认证。只需使用docker login命令即可。

实践

在本指南中,您将使用提供的Dockerfile构建一个简单的镜像,并将其推送到Docker Hub。

设置

获取示例应用程序。

如果您有Git,可以克隆示例应用程序的仓库。否则,您可以下载示例应用程序。选择以下选项之一:

使用Git克隆

在终端中使用以下命令克隆示例应用程序仓库:

sh 复制代码
git clone https://github.com/docker/getting-started-todo-app

下载并安装Docker Desktop。

如果您还没有Docker账户,请现在创建一个。完成后,使用该账户登录Docker Desktop。

构建镜像

现在,您已经在Docker Hub上有了一个仓库,是时候构建一个镜像并将其推送到仓库了。

在示例应用程序仓库的根目录中,使用终端运行以下命令。将YOUR_DOCKER_USERNAME替换为您的Docker Hub用户名:

sh 复制代码
docker build -t YOUR_DOCKER_USERNAME/concepts-build-image-demo .

例如,如果您的用户名是mobywhale,则运行以下命令:

sh 复制代码
docker build -t mobywhale/concepts-build-image-demo .

构建完成后,您可以使用以下命令查看镜像:

sh 复制代码
docker image ls

该命令将产生类似以下的输出:

sh 复制代码
REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
mobywhale/concepts-build-image-demo    latest    746c7e06537f   24 seconds ago   354MB

您实际上可以使用docker image history命令查看镜像的历史记录(或如何创建镜像):

sh 复制代码
docker image history mobywhale/concepts-build-image-demo

您将看到类似以下的输出:

sh 复制代码
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:d0764a717d1e

9d0af...   8.42MB

此输出显示了镜像的各层,突出了您添加的层以及从基础镜像继承的层。

推送镜像

现在,您已经构建了镜像,是时候将镜像推送到注册表了。

使用docker push命令推送镜像:

sh 复制代码
docker push YOUR_DOCKER_USERNAME/concepts-build-image-demo

如果收到"requested access to the resource is denied"的错误,请确保您已经登录并且您的Docker用户名在镜像标签中是正确的。

稍等片刻,您的镜像应当被推送到Docker Hub。

相关推荐
季春二九40 分钟前
解决 Docker 容器镜像拉取难题:全面指南
运维·docker·容器
^_^ 纵歌42 分钟前
virtualbox和docker的区别和优缺点以及如何选择
运维·docker·容器
march of Time4 小时前
docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤
docker·容器·kubernetes
板栗妖怪4 小时前
docker安装以及简单使用
docker·容器
乐之者v5 小时前
k8s 常用的命令
云原生·容器·kubernetes
蝎子莱莱爱打怪6 小时前
docker 重要且常用命令大全
java·spring cloud·docker·容器·eureka
小杰6666 小时前
安装docker版rabbitmq 3.12
docker·容器·rabbitmq
明明跟你说过9 小时前
【云原生】服务网格(Istio)如何简化微服务通信
运维·微服务·云原生·容器·kubernetes·k8s·istio
bestcxx11 小时前
(九)Docker 的网络通信
docker·容器
孤城28611 小时前
10 docker 安装 mysql详解
mysql·docker·微服务·容器