Lyndra's Blog

Docker中创建镜像

2025-03-06
工具教程系统维护 Docker
6分钟
1034字
温馨提示:本文最后更新于 2025-03-11 ,部分信息可能因时间推移而不再适用,欢迎反馈。

Docker中创建镜像

通过 Docker 创建符合某个应用开发环境的镜像,一般推荐使用 Dockerfile 来创建。使用 Dockerfile 创建镜像,可以复现,方便迁移。相较于使用 docker commit 保存容器数据的方式创建镜像,使用 Dockerfile 创建镜像更加灵活,可以清晰明了的自定义镜像的构建过程。

创建镜像的方式

Docker 的官方文档 builder 中详细介绍了 Docker 支持的构建镜像的方式。docker 实际上是使用 buildx 命令控制 BuildKit 后端来创建镜像。并且可以同时创建多个使用不同的 BuildKit 后端的构建器,每一个构建器还可以使用不同的驱动程序满足多种构建需求。但 buildx 命令是 Docker 19.03 版本引入的,之前的版本不支持相关的使用方式。

Buildx 支持以下构建驱动程序:

  • docker:使用捆绑在 Docker 守护进程中的 BuildKit 库。
  • docker-container:使用 Docker 创建专用的 BuildKit 容器。
  • kubernetes:在 Kubernetes 集群中创建 BuildKit pod。
  • remote:直接连接到手动管理的 BuildKit 守护进程。

其中需要说明的是,通常使用的 docker build 其实是 docker buildx build 的别名。区别在于 docker build 命令始终默认使用与 Docker Engine 捆绑在一起的默认构建器,以确保与旧版本的 Docker CLI 向后兼容。而使用 Buildx,构建客户端和守护进程 (BuildKit) 是分离的。这意味着可以从单个客户端使用多个构建器,甚至是远程构建器。

命令 docker build 使用本地的 docker 驱动来创建镜像,这样创建的镜像自动加载到本地镜像存储中,也是最常用的方式。

build 命令的格式如下:

Terminal window
1
docker build [OPTIONS] PATH | URL | -

其中的 PATH | URL | - 是构建上下文,既可以是一个目录或者是一个本地文件(PATH),也可以是一个 URL,甚至是从标准输入读取(-)。

docker-container 会启动专用的BuildKit容器来处理构建任务,支持使用QEMU(用户模式)构建非原生平台,可以用 --platform 标志指定要为哪些架构构建。一般用于需要非原生平台的场景。

更多关于 build 的命令行参数的使用可以参考官方文档:docker builddocker build context

但不论哪类方式,都需要 Dockfile 指导构建过程。

使用 Dockerfile 创建镜像

Dockerfile 的默认文件名是 Dockerfile,没有文件扩展名。运行 docker build 构建命令时自动查找和使用上下文中的名为 Dockerfile 的文件。

针对特定目的也可以使用不同名称的 Dockerfile。但一个常见的约定是将这些文件命名为 <something>.Dockerfile。可以使用 --file-fdocker build 命令指定 Dockerfile 的文件名。

例如:

Terminal window
1
docker build --file test.Dockerfile .

这里需要说明的是,构建命令需要提供上下文,上下文既可以是目录,也可以是文件(可以包含 Dockerfile)。由于提供了从标准输入读取上下文的方式,所以也可以直接从标准输入读取 Dockerfile 文件。

如果不需要任何上下文,可以使用 - 标志,从标准输入读取上下文,并仅传输 Dockerfile。

Terminal window
1
docker build -t image-name - < Dockerfile

如果需要上下文,则可以将上下文文件夹作为参数传递给构建命令。

Terminal window
1
docker build -t image-name -f Dockerfile /Path/to/context

注意:如果你的上下文文件夹中有大文件,或者在创建镜像时不需要的文件,请不要使用最常用的命令:

Terminal window
1
docker build -t image-name .

这会导致大文件在创建过程中,将当前文件夹下的所有文件都发送到构建进程,临时占用大量内存或者网络资源,浪费构建时间和资源。

如果只需要部分文件构建镜像,而不是整个文件夹,可以使用 .dockerignore 文件来排除不需要的文件。由于使用 .dockerignore 文件的情况比较少,此处不再介绍。可以参考:dockerignore

本文标题:Docker中创建镜像
文章作者:Lyndra
发布时间:2025-03-06
总访问量
总访客数人次
Copyright 2025
站点地图