Docker 绑定挂载
绑定挂载的核心作用
直接将宿主机的指定目录或文件映射到容器内部路径,实现以下目标:
- 实时同步:宿主机文件修改后,容器内立即生效。
- 持久化存储:容器删除后,宿主机目录数据保留。
- 灵活管理:无需重建镜像即可更新配置、代码或资源。
核心应用场景与示例
1. 开发环境代码实时同步
- 场景:在开发过程中,频繁修改代码并需要容器内实时运行最新版本。
- 用法:
1
2# 将本地项目目录挂载到容器的代码工作目录
docker run -v $(pwd)/src:/app/src -w /app/src my-dev-image npm start-v $(pwd)/src:/app/src:将当前目录下的src文件夹挂载到容器的/app/src。-w /app/src:设置容器的工作目录为挂载的代码路径。
- 效果:修改本地
src中的代码后,容器内进程(如npm start)自动加载最新代码。
2. 动态更新配置文件
- 场景:修改容器服务的配置文件(如 Nginx、MySQL、Redis 等),无需重启容器。
- 用法:
1
2# 挂载宿主机配置文件到容器内的默认配置路径
docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf nginx- 修改本地的
nginx.conf后,执行docker exec <容器ID> nginx -s reload即可生效。
- 修改本地的
- 扩展:挂载整个配置目录:
1
docker run -v $(pwd)/config:/etc/nginx/conf.d nginx
3. 静态资源托管
- 场景:将宿主机上的静态资源(如 HTML、图片、CSS)直接提供给容器服务(如 Nginx)。
- 用法:
1
2# 挂载本地资源目录到容器的静态资源路径
docker run -v $(pwd)/static:/usr/share/nginx/html nginx- 访问容器服务的
80端口时,Nginx 会直接加载宿主机static目录中的文件。
- 访问容器服务的
4. 日志持久化
- 场景:保留容器内生成的日志文件,避免容器删除后丢失。
- 用法:
1
2# 将容器内的日志目录挂载到宿主机
docker run -v $(pwd)/logs:/var/log/myapp my-app- 容器内应用写入
/var/log/myapp的日志会持久化到宿主机的logs目录。
- 容器内应用写入
5. 数据导入/导出
- 场景:快速将本地数据文件导入容器,或将容器内生成的数据导出到宿主机。
- 用法:
1
2
3
4
5# 导入本地数据到容器
docker run -v $(pwd)/data.csv:/app/input/data.csv data-processor
# 导出容器生成的数据到宿主机
docker run -v $(pwd)/output:/app/results data-processor
本地目录挂载的具体用法
1. 基础命令格式
使用
-v参数(简写)1
docker run -v /宿主机/绝对路径:/容器路径[:选项] 镜像名
- 示例:
1
docker run -v /home/user/project:/app -v /home/user/config:/etc/config my-image
- 示例:
使用
--mount参数(显式声明)1
docker run --mount type=bind,source=/宿主机/路径,target=/容器路径[,readonly] 镜像名
- 示例(只读挂载):
1
docker run --mount type=bind,source=$(pwd)/data,target=/app/data,readonly my-image
- 示例(只读挂载):
2. 路径处理技巧
- 绝对路径要求:
- 宿主机路径必须为绝对路径,使用
$(pwd)或pwd获取当前目录:1
2docker run -v $(pwd)/data:/data my-image # Linux/macOS
docker run -v %cd%/data:/data my-image # Windows CMD
- 宿主机路径必须为绝对路径,使用
- 宿主机目录不存在时:
Docker 会自动创建目录,但可能权限不足。建议手动创建并授权:1
mkdir -p ./data && docker run -v $(pwd)/data:/data my-image
3. 多目录挂载
- 同时挂载多个目录或文件:
1
2
3
4
5docker run \
-v $(pwd)/src:/app/src \
-v $(pwd)/config:/app/config \
-v $(pwd)/.env:/app/.env \
my-image
4. 只读挂载(防止容器误删数据)
- 限制容器对挂载目录的写入权限:
1
docker run -v $(pwd)/config:/app/config:ro my-image
:ro表示容器内目录为只读。
跨平台注意事项
Windows/macOS 路径格式
- 在 Docker Desktop 中,需将项目目录添加到 Settings → Resources → File Sharing。
- 示例(Windows):
1
docker run -v C:\Users\user\project:/app my-image
性能优化
- 在 macOS/Windows 的 Docker Desktop 中,绑定挂载性能较低,可添加挂载选项:
1
2docker run -v $(pwd)/src:/app/src:cached my-image # 提升读取性能
docker run -v $(pwd)/src:/app/src:delegated my-image # 提升写入性能
- 在 macOS/Windows 的 Docker Desktop 中,绑定挂载性能较低,可添加挂载选项:
验证挂载是否成功
进入容器查看目录
1
docker exec -it <容器ID> ls /容器路径
宿主机与容器文件双向修改测试
- 在宿主机创建文件:
1
touch ./host-data/test.txt
- 在容器内检查是否同步:
1
docker exec -it <容器ID> ls /容器路径/test.txt
- 在宿主机创建文件:
总结:何时使用本地目录挂载?
- 优先使用场景:
- 开发调试(代码实时同步)。
- 动态配置更新(Nginx、MySQL 等)。
- 快速数据交换(导入/导出文件)。
- 避免场景:
- 生产环境敏感数据(优先用命名卷或密钥管理)。
- 需要完全解耦宿主机与容器时(用命名卷更安全)。
示例:完整开发流程
本地创建项目并启动容器:
1
2
3mkdir myapp && cd myapp
echo "console.log('Hello Docker');" > app.js
docker run -v $(pwd):/app -w /app node:14 node app.js- 输出结果:
Hello Docker。
- 输出结果:
修改本地代码并重新运行:
1
2echo "console.log('Updated!');" > app.js
docker run -v $(pwd):/app -w /app node:14 node app.js- 输出结果:
Updated!(无需重建镜像或容器)。
- 输出结果:
通过本地目录挂载,开发者可以高效管理容器与宿主机之间的数据流动,尤其适合需要快速迭代和实时反馈的场景。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Erokin's Shelter!
