于2021年9月29日重新编辑
一、数据卷简介
1.1 什么是数据卷
数据卷就是将容器里的数据挂载出来,保存在宿主机上或者专门的容器上,相当于虚拟机挂载宿主机共享文件夹,用来实现数据的持久化。
1.2 两种方式
1)数据卷
将容器内数据直接挂载到宿主机上。
2)数据卷容器
将容器数据挂载到特定的容器上,让其在容器和主机、容器和容器之间可以共享数据。
1.3 数据卷的特性
- 可以在容器之间共享数据
- 对数据卷内的数据会立刻生效
- 删除了容器,数据卷的数据也不会消失
二、数据卷管理
使用run命令时可以使用--mount选项来使用数据卷,它支持三种类型的数据卷,如下
- volume:普通数据卷,映射到宿主机/var/lib/docker/volumes路径下
- bind:绑定数据卷,映射到主机指定路径下
- tmpfs:临时数据卷,存在内存中
2.1 指定路径挂载
为了方便对比,先介绍绑定数据卷,也叫指定路径挂载
1)在宿主机创建一个存放容器数据的目录
mkdir /opt/data
2)将宿主机的/opt/data挂载到容器的/data目录
docker run -dit --name c1 --mount type=bind,source=/opt/data,destination=/data centos:latest /bin/bash
:"
这里--mount指定类型为bind,绑定数据卷,后面source接宿主机地址,destination为容器地址
"
#可简写为
docker run -itd -v /opt/data:/data --name c1 centos:latest /bin/bash
3)查看挂载
docker inspect c1
2.2 匿名挂载
前面介绍了绑定数据卷,普通数据卷就很好理解了,普通数据卷会将容器路径自动挂载到宿主机/var/lib/docker/volumes路径下,不需要我们提前在宿主机创建挂载目录。
普通数据卷的方式分为
-
匿名数据卷
不写挂载的数据卷名,随机生成卷名
-
具名数据卷
自定义数据卷名
1)匿名挂载
这里-v选项后不写宿主机挂载目录,只写容器目录
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看挂载信息
docker inspect nginx01
可以看到不写数据卷名,docker会为我们随机生成一串字符作为数据卷名
PS:这里我修改过容器存放路径,所以不是默认的路径,关于修改容器存放路径看这篇。
查看数据卷信息
docker volume ls
2.3 具名挂载
这里同样不写宿主机目录,只写一个名字nginxconfig
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
:'
注意这里是写的nginxconfig,不是目录
/nginxconfig才是目录
'
查看数据卷信息
docker volume ls
发现有一个nginxconfig容器卷名
查看挂载信息
docker inspect nginx02
会发现宿主机目录是一个名为nginxconfig的数据卷。
2.3 挂载权限
容器挂载数据卷的默认权限是rw,可以更改为ro,让其无法更改数据卷内的文件。
/etc/nginx:ro
这里的ro是只读,这样容器就只能对nginx的配置文件只读,但是宿主机可以修改,这样就可以不进入容器修改配置文件,方便又安全。
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
2.4 数据卷容器
数据卷容器是一个专门提供数据卷给其他容器挂载的容器。
1)创建一个名为db01的容器作为数据卷容器
docker run -itd --name db01 -v docker_data:/data centos:latest
:'
这里容器卷容器挂载的是默认宿主机路径,卷名叫docker_data
'
2)创建db02容器并使用—volumes-from命令挂载数据卷容器db01
docker run -itd --volumes-from db01 --name db02 centos:latest
此时读写data目录中的文件对三个容器是实时更新的
除此之外还可以从其他已经挂载了容器卷的容器里挂载数据卷
docker run -d --name db03 --volumes-from db02 centos:latest
使用--volumes-from参数所挂载数据卷的容器自身不需要保持在运行状态
3)删除容器卷
数据卷是跟容器是不搭边的,即使删除了挂载数据卷的容器如之前挂载容器db01,db02和db03,数据卷也不会被删除,他还是保存在宿主机上,下面几种删除方式
#-v参数删除容器的同时删除数据卷
docker rm –v db01 db02 db03
#删除数据卷,删除前先查看有哪些数据卷在宿主机中
docker volume ls
docker volume rm data
#清理无主的数据卷,腾出空间
docker volume prune
三、数据迁移
3.1 备份数据
备份容器内的数据到宿主机当前目录下
docker run
-v $(pwd):/backup
--name worker centos:latest
tar cvf /backup/backup.tar /data
#查看备份文件大小
ls -sh
:'
上述命令解释如下
1)将宿主机的当前目录挂载到worker容器的/backup目录
2)tar命令将容器/data目录的数据打包放在/backup/目录下
3)在宿主机当前目录下就能看见已打包的容器数据了
'
3.2 迁移数据
docker run
-v $(pwd):/backup
--name worker02 centos:latest
tar xvf /backup/backup.tar
:"
挂载宿主机当前目录文件,解压从worker容器备份的文件,即完成数据迁移
"
四、命令总结
4.1 创建数据卷
1)创建数据卷
创建一个名为test的本地数据卷,该数据卷默认存放路径为宿主机/var/lib/docker/volumes/test
目录下
docker volume create -d local test
4.2 查看数据卷
2)查看数据卷的详细信息
docker volume inspect test
我这里改了docker的存放路径,方便管理,默认存放路径为/var/lib/docker/volumes/test
3)列出已有数据卷
docker volume ls
4.3 删除数据卷
1)清理未在使用的数据卷
此操作会把未在使用的数据卷删除,请谨慎使用
docker volume prune
2)删除数据卷
删除名为ubuntu的数据卷
docker volume rm ubuntu
3)-v参数删除容器的同时删除挂载的数据卷
docker rm –v db1 db2 data
五、小实验
5.1 mysql数据持久化实验
使用MySQL容器,再将mysql容器的数据挂载出来,这样就能实现MySQL数据持久化。
1)创建宿主机挂载目录
mkdir -p /home/mysql/conf
mkdir -p /home/mysql/data
2)下载MySQL容器并启动,挂载数据卷
docker run -d -p 3306:3306
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql mysql:5.7
:'
-p:将容器的3306端口映射到宿主机的3306端口,3306(宿主机端口):3306(容器端口)
-v: 将mysql的配置文件挂载出来,mysql的数据挂载出来
-e: 修改mysql的密码为123456
'
这样我们就能通过修改宿主机的配置文件,修改容器的mysql配置文件;
MySQL数据也能存放在宿主机上。
3)使用Navicat连接数据库
查看数据库版本
六、参考资料
《Docker技术入门与实践》第三版