Docker数据卷

时游大约 3 分钟

Docker 数据卷

什么是数据卷

容器的生命周期与数据是绑定的——容器删除,数据也没了。数据卷(volume)就是把容器内的目录挂载到宿主机,实现容器数据的持久化与容器间数据共享。

# 容器之间数据共享!  Docker容器中产生的数据,同步到本地,这就是卷技术。将容器目录挂载到本地
image-20220410140541089
image-20220410140541089

使用数据卷

# 方式一:直接使用命令挂载  -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...