Docker 卷
卷类型对比
| 类型 | 语法 | 管理方 | 使用场景 |
|---|---|---|---|
| 命名卷 | -v mydata:/app/data | Docker | 持久化数据、数据库 |
| 绑定挂载 | -v /host/path:/container/path | 宿主机 | 开发热更新、配置注入 |
| tmpfs | --tmpfs /tmp | 内存 | 敏感临时数据 |
| 匿名卷 | -v /app/data | Docker | 临时数据(生产慎用) |
命名卷
# 创建卷
docker volume create pgdata
# 挂载命名卷运行容器
docker run -d \
--name postgres \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
# 备份卷到 tarball
docker run --rm \
-v pgdata:/data:ro \
-v $(pwd):/backup \
alpine tar czf /backup/pgdata-backup.tar.gz -C /data .
# 删除卷
docker volume rm pgdata
docker volume prune # 删除所有未使用卷
绑定挂载
# 开发:挂载源码实现热更新
docker run -d \
--name dev-server \
-v $(pwd):/app \
-w /app -p 3000:3000 \
node:20 npm run dev
# 只读绑定挂载
docker run -d \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx
Docker Compose 卷
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
api:
image: myapi
volumes:
- ./src:/app/src
- /app/node_modules # 保留容器内的 node_modules
volumes:
pgdata:
driver: local