数据不丢:Docker 卷挂载(Volumes)与持久化存储方案
Docker 容器一旦删除,里面的数据就全没了——这是很多运维新手踩过的坑。主机选这篇 Linux 教程直接教你用 Volumes 把数据持久化到宿主机,不管容器怎么重建,数据都还在。

为什么 Docker 容器默认不保存数据?
Docker 容器的文件系统是临时的。每次 `docker rm` 之后,容器内部写入的文件、数据库记录、日志等全部消失。这是因为容器基于镜像层运行,任何修改只存在于可写层,一旦容器被删除,该层也随之销毁。
老手都知道,生产环境必须用卷挂载。别问为什么,照着做就行。
Docker Volumes 和 Bind Mounts 的区别
#### Volumes:Docker 官方推荐方案
Volumes 由 Docker 管理,存储在宿主机 `/var/lib/docker/volumes/` 目录下。优点是不依赖宿主机目录结构,跨平台兼容性好,适合生产环境。
创建卷
docker volume create mydata_vol
启动容器并挂载卷
docker run -d –name nginx-web -v mydata_vol:/usr/share/nginx/html nginx:latest
-v 参数:宿主机卷名:容器内路径
#### Bind Mounts:适合开发和调试
Bind Mounts 直接把宿主机某个目录映射到容器内。修改宿主机文件,容器内立即生效,适合本地开发。
启动容器并绑定宿主机目录
docker run -d –name nginx-dev -v /home/user/html:/usr/share/nginx/html nginx:latest
注意:宿主机路径必须是绝对路径
实战:用 Volumes 持久化 MySQL 数据库
数据库是典型需要持久化的场景。万一容器挂了,数据库文件还在卷里。
#### 第一步:创建卷并启动 MySQL
创建卷
docker volume create mysql_data
启动 MySQL 容器并挂载卷
docker run -d \
–name mysql-prod \
-e MYSQL_ROOT_PASSWORD=StrongP@ss123 \
-v mysql_data:/var/lib/mysql \
mysql:8.0
-v mysql_data:/var/lib/mysql:MySQL 数据文件默认在 /var/lib/mysql
#### 第二步:验证数据持久化
进入容器创建测试数据库
docker exec -it mysql-prod mysql -u root -p
输入密码后执行:
CREATE DATABASE testdb;
exit
停止并删除容器
docker stop mysql-prod && docker rm mysql-prod
用相同卷启动新容器
docker run -d \
–name mysql-new \
-e MYSQL_ROOT_PASSWORD=StrongP@ss123 \
-v mysql_data:/var/lib/mysql \
mysql:8.0
再次进入容器检查 testdb 是否还在
docker exec -it mysql-new mysql -u root -p -e "SHOW DATABASES;"
你应该能看到 testdb 仍然存在
排障:卷挂载后容器启动失败怎么办?
场景:绑定挂载宿主机空目录到容器内,结果容器启动报错。
报错示例
docker run -d –name test -v /empty_dir:/app nginx
容器启动失败,日志显示 "directory not empty"
原因:有些镜像要求挂载点目录不能为空,或者权限不足。
解决办法:先创建目录并设置正确权限。
创建目录并赋权
mkdir -p /app/data
chmod 755 /app/data
再启动容器
docker run -d –name test -v /app/data:/app nginx
老鸟叮嘱:千万不要把卷挂载到容器内重要系统目录
比如把宿主机 `/` 挂载到容器内 `/usr`,或者把卷挂载到 `/etc`、`/bin` 等目录。一旦容器内程序写入文件,可能覆盖宿主机系统文件,导致服务器崩溃。
高危操作,绝对禁止
docker run -d –name bad -v /:/usr nginx
这会覆盖容器内的 /usr 目录,导致 nginx 无法启动
常见问题 FAQ
Q:Docker 卷挂载后,容器内文件会被覆盖吗?
A:如果卷是空的,宿主机目录或卷会继承容器内原有文件。如果卷已有数据,宿主机内容会覆盖容器内的同名文件。
Q:Docker volumes 和 bind mounts 性能有区别吗?
A:生产环境建议用 volumes,性能差异很小。bind mounts 依赖宿主机文件系统,在 macOS/Windows 上性能较差。
Q:如何备份 Docker 卷数据?
A:直接备份 `/var/lib/docker/volumes/卷名/_data` 目录,或者用 `docker run` 挂载卷后打包。
Q:Docker 卷可以跨宿主机共享吗?
A:Docker 本身不支持。需要使用 NFS、GlusterFS 或云存储驱动来实现跨主机共享卷。
Q:容器重启后卷挂载会自动恢复吗?
A:只要容器配置没变,重启后挂载关系自动恢复。如果容器被删除,卷仍然保留,直到手动 `docker volume rm` 删除。
Q:Docker 卷占用磁盘空间太大怎么办?
A:用 `docker system prune -a –volumes` 清理未使用的卷和镜像。注意:这个命令会删除所有未被容器使用的卷,操作前请确认。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9509.html 商家投稿邮箱:zhujixuanblog@qq.com
