Docker数据持久化
Docker数据持久化
为什么需要数据持久化
容器是临时的,删除容器后数据会丢失。数据持久化可以:
- 保存容器生成的数据
- 在容器间共享数据
- 数据备份和恢复
数据卷(Volume)
# 创建数据卷
docker volume create mydata
# 查看数据卷
docker volume ls
docker volume inspect mydata
# 使用数据卷运行容器
docker run -d -v mydata:/data nginx
# 删除数据卷
docker volume rm mydata
docker volume prune
绑定挂载(Bind Mount)
# 挂载主机目录
docker run -d -v /host/path:/container/path nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
# 挂载单个文件
docker run -d -v /host/nginx.conf:/etc/nginx/nginx.conf:ro nginx
tmpfs挂载
# 内存挂载
docker run -d --tmpfs /tmp nginx
# 指定大小
docker run -d --tmpfs /tmp:size=100m nginx
数据卷驱动
# 使用NFS数据卷
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.100,rw \
--opt device=:/path/to/dir \
nfsvolume
# 使用NFS运行容器
docker run -d -v nfsvolume:/data nginx
实践:数据库数据持久化
# MySQL数据持久化
docker run -d \
--name mysql \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
mysql:8
# PostgreSQL数据持久化
docker run -d \
--name postgres \
-v pg_data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:14
数据备份
# 使用临时容器备份
docker run --rm -v mydata:/data -v $(pwd):/backup \
alpine tar czf /backup/mydata-backup.tar.gz -C /data .
# 恢复数据
docker run --rm -v mydata:/data -v $(pwd):/backup \
alpine tar xzf /backup/mydata-backup.tar.gz -C /data
数据卷管理
# 查看数据卷使用情况
docker system df -v
# 清理未使用的数据卷
docker volume prune
# 查看数据卷挂载点
docker inspect --format '{{json .Mounts}}' container_name
实践:Web应用数据管理
#!/bin/bash
# 创建必要目录
mkdir -p ./nginx/conf.d
mkdir -p ./nginx/html
mkdir -p ./app/data
# 运行Nginx
docker run -d --name web \
-p 80:80 \
-v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
-v $(pwd)/nginx/html:/usr/share/nginx/html \
nginx
# 运行应用
docker run -d --name app \
-v $(pwd)/app/data:/app/data \
myapp:v1
数据卷最佳实践
- 使用命名卷而非匿名卷
- 重要数据定期备份
- 使用:ro标记只读挂载
- 避免挂载敏感数据
- 使用.dockerignore排除不需要的文件
总结
Docker数据管理是生产环境中必须掌握的技能。正确使用数据卷和挂载,可以确保数据的安全性和可恢复性。