<返回目录     Powered by claude/xia兄

第6课: 数据管理

为什么需要数据持久化?

容器是临时的,删除容器后数据会丢失。Docker提供三种数据持久化方式:

Volume - 数据卷

# 创建数据卷
docker volume create mydata

# 查看所有数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect mydata

# 使用数据卷运行容器
docker run -d --name mysql-db -v mydata:/var/lib/mysql mysql

# 删除数据卷
docker volume rm mydata

# 删除所有未使用的数据卷
docker volume prune
Volume优势:

Bind Mount - 绑定挂载

# 挂载主机目录到容器
docker run -d -v /host/path:/container/path nginx

# 使用绝对路径
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx

# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx

# 使用--mount语法(推荐)
docker run -d \
  --mount type=bind,source=/host/path,target=/container/path \
  nginx

实战示例 - MySQL数据持久化

# 创建MySQL容器并持久化数据
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

# 验证数据持久化
docker exec -it mysql-server mysql -uroot -p123456 -e "CREATE DATABASE testdb;"

# 删除容器
docker rm -f mysql-server

# 重新创建容器,数据仍然存在
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

# 验证数据库仍然存在
docker exec -it mysql-server mysql -uroot -p123456 -e "SHOW DATABASES;"

实战示例 - Nginx配置和网站文件

# 创建本地目录
mkdir -p ~/nginx/html ~/nginx/conf

# 创建配置文件
cat > ~/nginx/conf/nginx.conf << 'EOF'
server {
    listen 80;
    server_name localhost;
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}
EOF

# 创建网站文件
echo "

Hello Docker!

" > ~/nginx/html/index.html # 运行Nginx容器 docker run -d \ --name my-nginx \ -p 8080:80 \ -v ~/nginx/html:/usr/share/nginx/html:ro \ -v ~/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf:ro \ nginx

数据卷容器

# 创建数据卷容器
docker create -v /data --name datastore ubuntu

# 其他容器使用数据卷容器
docker run -d --volumes-from datastore --name app1 nginx
docker run -d --volumes-from datastore --name app2 nginx

# 多个容器共享同一数据卷

备份和恢复

# 备份数据卷
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  ubuntu tar czf /backup/mydata-backup.tar.gz /data

# 恢复数据卷
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  ubuntu tar xzf /backup/mydata-backup.tar.gz -C /

# 复制数据卷
docker run --rm \
  -v mydata:/from \
  -v newdata:/to \
  ubuntu cp -av /from/. /to/

tmpfs Mount - 临时文件系统

# 使用tmpfs(数据存储在内存中)
docker run -d \
  --tmpfs /tmp:rw,size=100m \
  nginx

# 适用于敏感数据,容器停止后自动清除

查看容器挂载信息

# 查看容器挂载详情
docker inspect -f '{{ .Mounts }}' container_name

# 查看容器使用的数据卷
docker inspect -f '{{ range .Mounts }}{{ .Name }}{{ end }}' container_name

最佳实践

实践练习

  1. 创建一个MySQL容器,使用Volume持久化数据
  2. 创建数据库和表,然后删除容器重新创建,验证数据仍存在
  3. 使用Bind Mount挂载本地HTML文件到Nginx容器
  4. 备份一个数据卷到tar文件
  5. 创建两个容器共享同一个数据卷