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 命令的格式如下:
1docker build [OPTIONS] PATH | URL | -
其中的 PATH | URL | -
是构建上下文,既可以是一个目录或者是一个本地文件(PATH),也可以是一个 URL,甚至是从标准输入读取(-)。
docker-container 会启动专用的BuildKit容器来处理构建任务,支持使用QEMU(用户模式)构建非原生平台,可以用 --platform
标志指定要为哪些架构构建。一般用于需要非原生平台的场景。
更多关于 build 的命令行参数的使用可以参考官方文档:docker build、docker build context
但不论哪类方式,都需要 Dockfile 指导构建过程。
使用 Dockerfile 创建镜像
Dockerfile 的默认文件名是 Dockerfile
,没有文件扩展名。运行 docker build
构建命令时自动查找和使用上下文中的名为 Dockerfile
的文件。
针对特定目的也可以使用不同名称的 Dockerfile。但一个常见的约定是将这些文件命名为 <something>.Dockerfile
。可以使用 --file
或 -f
为 docker build
命令指定 Dockerfile
的文件名。
例如:
1docker build --file test.Dockerfile .
这里需要说明的是,构建命令需要提供上下文,上下文既可以是目录,也可以是文件(可以包含 Dockerfile)。由于提供了从标准输入读取上下文的方式,所以也可以直接从标准输入读取 Dockerfile 文件。
如果不需要任何上下文,可以使用 -
标志,从标准输入读取上下文,并仅传输 Dockerfile。
1docker build -t image-name - < Dockerfile
如果需要上下文,则可以将上下文文件夹作为参数传递给构建命令。
1docker build -t image-name -f Dockerfile /Path/to/context
注意:如果你的上下文文件夹中有大文件,或者在创建镜像时不需要的文件,请不要使用最常用的命令:
1docker build -t image-name .
这会导致大文件在创建过程中,将当前文件夹下的所有文件都发送到构建进程,临时占用大量内存或者网络资源,浪费构建时间和资源。
如果只需要部分文件构建镜像,而不是整个文件夹,可以使用 .dockerignore 文件来排除不需要的文件。由于使用 .dockerignore 文件的情况比较少,此处不再介绍。可以参考:dockerignore