数据卷容器 #

什么是数据卷容器? #

数据卷容器是专门用于存储数据的容器,其他容器可以通过--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数据的备份和恢复策略。