1. 概述
容器化技术在现代软件开发中扮演着至关重要的角色,它确保了环境间的一致性,并简化了依赖管理。Docker 作为主流的容器化平台,使开发者能够轻松管理容器。然而,很多时候我们需要对标准镜像进行定制,例如添加配置文件或依赖,而无需从头开始重建镜像。
本文将介绍如何使用 docker compose 向标准 Docker 镜像中添加文件,从而高效地扩展和定制镜像,避免直接修改原始的 Dockerfile。
2. 理解 Docker 镜像与 Docker Compose
在深入定制之前,先明确 Docker 镜像和 Docker Compose 的基本概念。
- Docker 镜像是预构建的运行环境,包含运行应用所需的一切,比如代码、依赖库和配置。
- Docker Compose 是一个用于管理多容器应用的工具,通过
docker-compose.yml
文件定义服务、网络、存储等容器化应用的运行方式。
有了这些基础,我们就可以用 Docker Compose 来定制镜像了。
3. 使用 Docker Compose 构建自定义镜像
这种方式通过 docker-compose build
命令,将本地文件打包进镜像中。适用于需要将配置、脚本等静态资源固化进镜像的场景。
3.1. 项目结构
示例项目结构如下:
├── docker-compose.yml
└── LocalFolder/
├── Dockerfile
└── configfile/
└── config.txt
其中 config.txt
的内容如下:
This is a demo config file.
3.2. docker-compose.yml 配置
services:
my-config-app:
build: LocalFolder/.
image: custom-image
该配置定义了一个服务,使用 LocalFolder
目录下的 Dockerfile 构建名为 custom-image
的镜像。
3.3. Dockerfile 内容
FROM nginx:alpine
COPY ./configfile /LocalFolder/configfile
该 Dockerfile 基于 nginx:alpine
,并将本地配置文件复制到镜像中。
3.4. 构建镜像
执行以下命令进行构建:
$ docker compose up --build
3.5. 检查镜像内容
构建完成后,可以运行容器并检查文件是否已正确打包进镜像:
$ docker run -it --rm custom-image /bin/bash
bash-5.1# cat /LocalFolder/configfile/config.txt
This is a demo config file.
✅ 文件存在,说明构建成功。
4. 使用 Docker Volume 挂载文件
这种方式通过 volume 将主机上的文件或目录挂载到容器中,适用于需要频繁修改配置或数据的场景,避免重复构建镜像。
4.1. 确定源目录与目标路径
确定本地目录(源)与容器内挂载路径(目标),注意两者路径可以不同。
4.2. docker-compose.yml 配置
services:
web:
image: nginx:alpine
volumes:
- ./LocalFolder:/usr/share/LocalFolder
该配置将本地的 LocalFolder
目录挂载到容器的 /usr/share/LocalFolder
路径下。
4.3. 启动容器
$ docker compose up -d
查看容器 ID:
$ docker ps
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47624ce40bce nginx:alpine "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp docker_compose_test-web-1
4.4. 检查挂载内容
进入容器检查文件是否挂载成功:
$ docker exec -it 47624ce40bce /bin/sh
/ # cd /usr/share/LocalFolder/configfile
/usr/share/LocalFolder/configfile # cat config.txt
This is a demo config file.
✅ 文件存在,说明 volume 挂载成功。
5. 使用 Docker Swarm 部署
Docker Swarm 是 Docker 原生的容器编排工具,支持集群部署与服务管理。我们也可以在 Swarm 模式下使用 bind mount 挂载本地文件。
5.1. 初始化 Swarm 模式
$ docker swarm init
5.2. 部署 Stack
使用 docker-compose.yml
文件部署服务:
$ docker stack deploy -c docker-compose.yml my_stack
之后使用 docker ps
检查容器状态,并验证挂载是否生效。
⚠️ 注意:Swarm 模式下,所有节点必须能访问挂载路径,否则服务可能无法启动。
6. 其他方式:docker cp
如果你不想构建或挂载,也可以直接将文件复制进运行中的容器,适用于临时调试或快速修改。
6.1. Docker Compose V1
$ docker cp ./config.txt "$(docker compose ps -q web)":/usr/share
6.2. Docker Compose V2
$ docker compose cp ./config.txt web:/usr/share
两种方式都能将本地文件复制进容器中,适合快速修改而不影响镜像构建流程。
7. 总结
本文介绍了几种使用 Docker Compose 定制标准镜像的方法:
方法 | 适用场景 | 是否持久化 | 是否需重建镜像 |
---|---|---|---|
构建(build) | 固定配置、脚本 | ✅ | ✅ |
Volume 挂载 | 动态文件、调试 | ❌(容器销毁即失效) | ❌ |
docker cp | 临时调试 | ❌ | ❌ |
Docker Swarm | 集群部署 | ✅ | 可选 |
✅ 推荐做法:
- 需要长期保存配置:使用
docker-compose build
; - 频繁修改文件:使用 volume;
- 临时修改:使用
docker cp
; - 生产部署:结合 volume 与 swarm 模式,实现灵活扩展。
合理选择方法,能让你在开发、调试、部署中游刃有余。