15.5.4 容器持久化最佳实践与常见问题
容器持久化最佳实践与常见问题#
持久化原理草图#
持久化最佳实践(含示例与命令解释)#
# 创建命名卷
docker volume create mydata
# 查看卷详情(Mountpoint 为真实路径)
docker volume inspect mydata
docker run -d --name app \
-v appdata:/data \
-v /opt/app/conf:/config:ro \
-v /opt/app/logs:/logs \
myapp:1.0
docker run -d --name badapp myapp:1.0
docker run -d --name goodapp -v appdata:/var/lib/app myapp:1.0
- 数据库持久化参数与卷策略匹配(以 MySQL 为例)
cat >/opt/mysql/conf/my.cnf <<'EOF'
[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1
EOF
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=Root@123 \
-v mysql_data:/var/lib/mysql \
-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
mysql:8.0
docker run -d --name web \
-v /opt/web/conf:/etc/web:ro \
-v webdata:/var/lib/web \
nginx:1.25
mkdir -p /backup
docker run --rm \
-v mysql_data:/data:ro \
-v /backup:/backup \
alpine:3.19 \
sh -c "tar czf /backup/mysql_data_$(date +%F).tgz -C /data ."
ls -lh /backup/*.tgz
常见问题与处理(含排错命令)#
docker exec -it mysql id
ls -ld /var/lib/docker/volumes/mysql_data/_data
chown -R 999:999 /var/lib/docker/volumes/mysql_data/_data
docker exec -it app sh -c "ls -l /data && grep -R 'data_dir' -n /config"
docker volume ls
docker ps -a --filter volume=mydata
docker volume create --label env=prod --label app=order orderdata
df -h
du -sh /var/lib/docker/volumes/* | sort -h | tail
docker ps --filter volume=shareddata
- 创建命名卷
labdata,启动一个 alpine 容器写入文件,再删除容器并验证数据仍在卷中。
docker volume create labdata
docker run --rm -v labdata:/data alpine:3.19 sh -c "echo hello > /data/hello.txt"
docker run --rm -v labdata:/data alpine:3.19 cat /data/hello.txt
- 使用 bind mount 启动
nginx,将 /opt/nginx/conf 以只读方式挂载,验证容器内无法修改配置文件。
mkdir -p /opt/nginx/conf
echo "user nginx;" >/opt/nginx/conf/nginx.conf
docker run -d --name nginx \
-v /opt/nginx/conf:/etc/nginx:ro \
nginx:1.25
# 尝试修改(应失败)
docker exec -it nginx sh -c "echo test >> /etc/nginx/nginx.conf"
生产落地建议#
- 制定统一的卷命名、目录规范与备份周期,并固化到部署模板。
- 建立卷使用台账,定期审计
docker volume ls 与备份完整性。