Docker数据卷
大约 3 分钟
Docker 数据卷
什么是数据卷
容器的生命周期与数据是绑定的——容器删除,数据也没了。数据卷(volume)就是把容器内的目录挂载到宿主机,实现容器数据的持久化与容器间数据共享。
# 容器之间数据共享! Docker容器中产生的数据,同步到本地,这就是卷技术。将容器目录挂载到本地

使用数据卷
# 方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器目录
双向同步:宿主机改了文件,容器内立刻可见,反之亦然。
实战:安装MySQL
# 下载MySQL
docker pull mysql
# 启动并映射MySQL文件
docker run -d -p 3310:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=a123456 \
--name mysql01 mysql
# 命令解析
-d 后台运行
-p 端口映射
-v 数据卷挂载,可以写多个-v
-e 环境配置(例如密码)
--name 设置容器名字
把 /var/lib/mysql 挂出来后,即使删除容器重新 run 一个,数据库数据依然在宿主机上。
具名挂载和匿名挂载
# 匿名挂载(只写容器内路径而不写容器外路径)
-v 容器内路径
docker run -d --name nginx011 -v /etc/nginx nginx
# 具名挂载(通过 -v 卷名:容器内路径)
docker run -d --name nginx012 -v juming-nginx:/etc/nginx nginx
# 查看所有卷
docker volume ls
DRIVER VOLUME NAME
local 9969e71d3d42254338c4f10ae4fcc603b2a0e5062d8f53dd6890b31be2e86c33
local juming-nginx
# 查看一个卷的详情
docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-04-11T06:35:40-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 宿主机路径
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录情况下都是在 /var/lib/docker/volumes/xxx
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载(卷名以 / 开头就是指定路径,否则是卷名)
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展:读写权限
# 通过 -v 容器内路径:ro rw 改变读写权限
ro:readonly # 只读,该路径只能通过宿主机来操作,容器内部无法操作!
rw:readwrite # 默认
# 一旦设定了容器权限,容器对我们挂载出来的内容就有权限限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
数据卷容器(--volumes-from)
多个容器共享同一份数据时,可以指定从另一个容器继承卷配置:
# 先启动父容器,带具名卷
docker run -d --name docker01 -v volumn01:/data centos
# 子容器继承 docker01 的卷
docker run -d --name docker02 --volumes-from docker01 centos
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止;但一旦持久化到了宿主机,卷不会删除(docker volume rm 卷名 才删)。
常用卷命令汇总
docker volume ls # 列出所有卷
docker volume inspect 卷名 # 查看卷详情
docker volume rm 卷名 # 删除卷
docker volume prune # 清理无主卷(谨慎)
docker run -v 宿主路径:容器路径:rw # 挂载并指定权限
Loading...
