数据卷容器 #
什么是数据卷容器? #
数据卷容器是专门用于存储数据的容器,其他容器可以通过--volumes-from参数共享其数据卷。
数据卷容器架构 #
text
┌─────────────────────────────────────────────────────┐
│ 数据卷容器架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Data Volume Container │ │
│ │ (数据卷容器) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Volume1 │ │ Volume2 │ │ Volume3 │ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ └───────┼────────────┼────────────┼───────────┘ │
│ │ │ │ │
│ │ ┌───────┴───────┐ │ │
│ │ │ │ │ │
│ ┌────▼────┴──┐ ┌───▼────┴────┐ │
│ │ Container1 │ │ Container2 │ │
│ │ (应用容器) │ │ (应用容器) │ │
│ └────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
创建数据卷容器 #
基本创建方式 #
bash
# 创建数据卷容器
docker create -v /data --name data-container busybox
# 或使用特定镜像
docker create -v /data --name data-container alpine
# 创建多个数据卷
docker create \
-v /data \
-v /logs \
-v /config \
--name data-container \
alpine
使用Dockerfile创建 #
dockerfile
# Dockerfile for data container
FROM alpine
VOLUME ["/data", "/logs", "/config"]
# 数据卷容器不需要运行任何进程
CMD ["true"]
bash
# 构建数据卷容器镜像
docker build -t data-container-image .
# 创建数据卷容器
docker create --name data-container data-container-image
使用数据卷容器 #
–volumes-from参数 #
bash
# 从数据卷容器挂载卷
docker run -d \
--name app1 \
--volumes-from data-container \
nginx
# 多个容器共享同一数据卷容器
docker run -d \
--name app2 \
--volumes-from data-container \
nginx
# 链式挂载
docker run -d \
--name app3 \
--volumes-from app1 \
nginx
只读挂载 #
bash
# 只读挂载数据卷容器
docker run -d \
--name reader \
--volumes-from data-container:ro \
nginx
应用场景 #
1. 数据库主从复制 #
bash
# 创建数据卷容器
docker create -v /var/lib/mysql --name mysql-data busybox
# 主数据库
docker run -d \
--name mysql-master \
--volumes-from mysql-data \
-e MYSQL_ROOT_PASSWORD=root \
mysql:8.0
# 从数据库(共享数据)
docker run -d \
--name mysql-slave \
--volumes-from mysql-data \
-e MYSQL_ROOT_PASSWORD=root \
mysql:8.0
2. Web服务器集群 #
bash
# 创建共享静态文件的数据卷容器
docker create \
-v /usr/share/nginx/html \
--name web-data \
busybox
# 复制静态文件到数据卷容器
docker cp ./html/. web-data:/usr/share/nginx/html/
# 多个Nginx容器共享
docker run -d --name web1 --volumes-from web-data -p 8081:80 nginx
docker run -d --name web2 --volumes-from web-data -p 8082:80 nginx
docker run -d --name web3 --volumes-from web-data -p 8083:80 nginx
3. 日志收集 #
bash
# 创建日志数据卷容器
docker create -v /var/log/app --name log-data busybox
# 应用容器写入日志
docker run -d \
--name app \
--volumes-from log-data \
myapp
# 日志收集容器读取日志
docker run -d \
--name log-collector \
--volumes-from log-data:ro \
log-collector-image
4. 配置共享 #
bash
# 创建配置数据卷容器
docker create \
-v /etc/app/config \
--name config-data \
busybox
# 复制配置文件
docker cp ./config/. config-data:/etc/app/config/
# 多个应用共享配置
docker run -d --name app1 --volumes-from config-data:ro myapp
docker run -d --name app2 --volumes-from config-data:ro myapp
Docker Compose中使用 #
配置示例 #
yaml
version: '3.8'
services:
# 数据卷容器
data:
image: busybox
volumes:
- /data
- /logs
command: ["true"]
# 应用容器
app:
image: myapp
volumes_from:
- data
depends_on:
- data
# 备份容器
backup:
image: alpine
volumes_from:
- data:ro
volumes:
- ./backup:/backup
command: tar czf /backup/backup.tar.gz /data
完整示例 #
yaml
version: '3.8'
services:
# 数据卷容器
db-data:
image: busybox
volumes:
- /var/lib/mysql
command: ["true"]
# 主数据库
db-master:
image: mysql:8.0
volumes_from:
- db-data
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_REPLICATION_MODE: master
# 从数据库
db-slave:
image: mysql:8.0
volumes_from:
- db-data:ro
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_REPLICATION_MODE: slave
depends_on:
- db-master
数据卷容器管理 #
查看数据卷 #
bash
# 查看容器挂载的数据卷
docker inspect --format '{{json .Mounts}}' data-container | jq
# 查看数据卷详情
docker volume ls
docker volume inspect <volume-name>
备份数据卷容器 #
bash
# 备份数据卷容器中的数据
docker run --rm \
--volumes-from data-container \
-v $(pwd)/backup:/backup \
alpine tar czf /backup/data-backup.tar.gz /data
恢复数据卷容器 #
bash
# 创建新的数据卷容器
docker create -v /data --name new-data-container busybox
# 恢复数据
docker run --rm \
--volumes-from new-data-container \
-v $(pwd)/backup:/backup \
alpine tar xzf /backup/data-backup.tar.gz -C /
删除数据卷容器 #
bash
# 注意: 删除数据卷容器不会删除数据卷
docker rm data-container
# 要删除数据卷,需要单独删除
docker volume rm <volume-name>
# 或在删除容器时使用-v参数
docker rm -v data-container
数据卷容器 vs 命名卷 #
text
┌─────────────────────────────────────────────────────┐
│ 数据卷容器 vs 命名卷 │
├─────────────────────────────────────────────────────┤
│ │
│ 数据卷容器: │
│ - 通过容器共享数据 │
│ - 适合多容器共享 │
│ - 需要管理额外容器 │
│ - 旧式方法 │
│ │
│ 命名卷: │
│ - 直接使用卷名 │
│ - 更简单直接 │
│ - 推荐方式 │
│ - 更好的可移植性 │
│ │
│ 推荐使用命名卷: │
│ docker run -v mydata:/app/data nginx │
│ │
│ 而不是数据卷容器: │
│ docker run --volumes-from data-container nginx │
│ │
└─────────────────────────────────────────────────────┘
最佳实践 #
1. 使用命名卷替代数据卷容器 #
yaml
# 推荐: 使用命名卷
version: '3.8'
services:
app:
image: myapp
volumes:
- app-data:/app/data
volumes:
app-data:
2. 数据卷容器命名规范 #
bash
# 使用清晰的后缀
docker create -v /data --name myapp-data-container busybox
docker create -v /logs --name myapp-logs-container busybox
3. 定期备份 #
bash
#!/bin/bash
# backup-volume-container.sh
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
docker run --rm \
--volumes-from data-container \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/data-${DATE}.tar.gz /data
4. 监控数据卷使用 #
bash
# 查看数据卷使用情况
docker system df -v
# 查看数据卷大小
docker volume inspect mydata --format '{{.Mountpoint}}'
sudo du -sh $(docker volume inspect mydata --format '{{.Mountpoint}}')
小结 #
本节学习了Docker数据卷容器的使用方法:
- 数据卷容器的概念
- 创建和使用数据卷容器
- 应用场景示例
- Docker Compose中的配置
- 数据卷容器的管理
下一步 #
接下来,让我们学习 数据备份与恢复,了解Docker数据的备份和恢复策略。