容器默认的写层具有两个关键缺点:
为了解决这个问题,Docker 提供了数据卷(Volume)机制,将数据从容器中解耦出来,形成独立、持久、可复用的数据存储空间。
类型 | 命令示例 | 挂载路径(宿主机) | 特点 | 推荐场景 |
---|---|---|---|---|
匿名卷 | -v /data |
/var/lib/docker/volumes/<随机ID> |
无需管理、自动创建,易失 | 临时数据 |
具名卷 | -v myvolume:/data |
/var/lib/docker/volumes/myvolume/_data |
可复用、可管理、自动创建 | 持久存储 |
绑定挂载 | -v /host/path:/data |
指定宿主机目录 | 显式路径、高灵活、强耦合 | 本地开发、配置挂载、热更新 |
docker run -v /data busybox
/data
/var/lib/docker/volumes/
下docker volume create mydata
docker run -v mydata:/data busybox
mydata
的卷/var/lib/docker/volumes/mydata/_data/
docker run -v $(pwd)/html:/usr/share/nginx/html nginx
html
目录,映射进容器内的 Nginx 静态文件目录容器路径 /data
匿名卷 → /var/lib/docker/volumes/<随机ID>/_data
具名卷 → /var/lib/docker/volumes/myvolume/_data
绑定挂载 → /home/user/mydata (由你决定)
默认情况下,运行 MySQL 容器时数据保存在容器写层中,容器删除后数据也会丢失。
示例:具名卷持久化数据库
docker volume create mysql-data
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:5.7
mysql-data
中/var/lib/docker/volumes/mysql-data/_data
验证数据:
docker exec -it mysql mysql -uroot -p123456
在 Docker Compose 出现前,数据卷容器是一种用于数据共享的经典方法。
原理
使用一个专门的容器来管理卷,再让其他容器通过
--volumes-from
挂载它的卷。
示例:
# 创建数据卷容器
docker create -v /data --name datacontainer busybox
# 在其他容器中挂载它的卷
docker run --volumes-from datacontainer busybox ls /data
特点: