Docker容器数据卷持久化教程
为什么要做Docker数据卷持久化?
初学者常发现:容器删掉后,里面的数据库、配置文件也一起消失了。Docker容器数据卷持久化就是为了解决这个问题——把容器内的数据存到宿主机上,让数据独立于容器生命周期。
下面我会用最简单的方式,带你从零实现。
环境准备:确保Docker已安装并启动
打开终端(Linux/macOS)或PowerShell(Windows),输入:
docker --version如果能看到版本号,例如Docker version 24.0.7,说明已安装。
如果没有,先去Docker官网下载安装。
创建一个测试容器作为示例:
docker run -d --name my_nginx nginx:alpine这个命令会拉取一个轻量级Nginx并后台运行。
接下来我们会让它的网页目录挂载到宿主机上。
方法一:绑定挂载(Bind Mount)——直接映射宿主机目录
绑定挂载就是把宿主机的某个文件夹“注入”到容器中。
假设你想把当前目录下的html文件夹当作Nginx的网站根目录。
- 在宿主机上创建文件夹:
mkdir ~/myweb && cd ~/myweb
echo "Hello, Docker Volume!
" > index.html- 启动容器时加上
-v参数:
docker run -d --name my_web -v $(pwd):/usr/share/nginx/html:ro -p 8080:80 nginx:alpine$(pwd):当前目录路径(Windows下用绝对路径如D:/myweb)/usr/share/nginx/html:容器内Nginx的网页目录:ro:只读挂载(可选,不加则为读写)
- 访问
http://localhost:8080,你会看到刚才写的HTML内容。修改宿主机上的index.html,刷新页面就会同步变化。
方法二:Docker卷(Volume)——推荐持久化方案
Docker卷由Docker管理,比绑定挂载更安全、跨主机迁移更方便。
创建并使用命名卷的步骤:
- 创建卷:
docker volume create mydata- 启动容器时挂载卷:
docker run -d --name my_data_app -v mydata:/data alpine sleep 3600容器会把写入/data的文件保存到卷中。
- 验证数据:进入容器写个文件:
docker exec -it my_data_app sh -c "echo 'persistent data' > /data/test.txt"- 删除容器再重新使用同一个卷:
docker rm -f my_data_app
docker run -d --name new_app -v mydata:/data alpine cat /data/test.txt查看日志:docker logs new_app,会输出persistent data,证明数据还在。
常见问题与避坑
- 权限问题:绑定挂载时,容器内进程以容器用户运行,可能没有宿主文件夹的写权限。解决办法是在
-v后添加:Z(Linux SELinux)或给宿主文件夹开放权限:chmod 777 ~/myweb。 - 路径写错:Windows使用绑定挂载时必须用绝对路径,且目录分隔符用反斜杠或正斜杠?推荐用正斜杠:
-v D:/myweb:/usr/share/nginx/html(Docker Desktop会自动转换)。 - 卷列表清理:用
docker volume ls查看所有卷,用docker volume prune删除未使用的卷,避免磁盘空间浪费。 - 数据卷不持久化:如果容器启动时没有使用
-v或--mount,数据就只存在于容器内,容器删除就丢失。记得每次新建容器都要挂载卷或绑定目录。
验证Docker容器数据卷持久化效果
最终验证步骤:
- 启动一个挂载了卷的数据库容器(例如PostgreSQL):
docker pull postgres:15
docker run -d --name pg --volume pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=secret postgres:15- 连接并创建一条测试记录(用
docker exec -it pg psql -U postgres执行CREATE DATABASE test;)。 - 停止并删除容器:
docker rm -f pg。 - 再用同一个卷启动一个新容器:
docker run -d --name pg2 --volume pgdata:/var/lib/postgresql/data postgres:15。 - 进入新容器检查数据库:
docker exec -it pg2 psql -U postgres -l,你会看到test数据库依然存在。
这样就完成了完整的Docker容器数据卷持久化实操。
以后要备份数据,只需备份宿主机上的绑定目录或/var/lib/docker/volumes/下的卷文件夹即可。