六、数据管理
于2021年9月29日重新编辑
于2022年4月17日重新编辑
一、数据卷简介
1.1 什么是数据卷
数据卷就是将容器里的文件挂载出来,保存在宿主机上(也可以是容器上),这样如果不小心删除了容器也没关系,数据还存储在宿主机上,这样就实现了数据的持久化。
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 -itd -v /opt/data:/data --name c1 centos:latest /bin/bash
#也可写为
docker run -dit --name c1 \
--mount type=bind,source=/opt/data,destination=/data \
centos:latest /bin/bash
这里--mount指定类型为bind,绑定数据卷,后面source接宿主机地址,destination为容器地址
-v:绑定一个数据卷
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)写数据卷名(推荐使用)
这里同样不写宿主机目录,只写一个名字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)创建一个名为db1的数据卷容器
docker run -itd --name db1 -v data:/db_data centos:latest
注意:容器db1挂载的是宿主机的目录,卷名叫data
2)创建db2容器挂载数据卷容器db1
docker run -itd --volumes-from db1 --name db2 mysql:latest
此时这两个容器跟宿主机的挂载关系为
db2-->db1-->宿主机data
此时修改宿主机中的data目录中的文件内容对这两个容器是实时更新的。
3)删除容器卷
#-v参数删除容器的同时删除数据卷
docker rm –v db1 db2
#查看数据卷,删除数据卷
docker volume ls
docker volume rm data
#清理无主的数据卷,腾出空间
docker volume prune
三、数据卷管理
3.1 创建数据卷
1)创建一个名为test的本地数据卷,该数据卷默认存放路径为宿主机/var/lib/docker/volumes/test
目录下
docker volume create -d local test
#或者
docker volume create test
2)查看数据卷的详细信息
docker volume inspect test
我这里改了docker的存放路径,方便管理,默认存放路径为/var/lib/docker/volumes/test
3)列出已有数据卷
docker volume ls
3.2 删除数据卷
1)清理未在使用的数据卷
此操作会把未在使用的数据卷删除,请谨慎使用
docker volume prune
2)删除数据卷
删除名为ubuntu的数据卷
docker volume rm ubuntu
3)-v参数删除容器的同时删除挂载的数据卷
docker rm –v db1 db2
四、案例
4.1 数据迁移
1)备份数据
#运行一个名为worker的容器,将/backup目录挂载到宿主机当前目录下
docker run -it \
-v $(pwd):/backup \
--name worker centos:latest
#在容器中执行tar打包/data目录
[root@16ab804c68ab /]# tar cvf /backup/backup.tar /data
[root@16ab804c68ab /]# exit
#在宿主机中查看备份文件大小
[root@docker ]# ls -sh
total 12K
12K backup.tar
2)迁移数据
#运行一个名为worker02的容器,将/backup目录挂载到宿主机当前目录下
docker run -it \
-v $(pwd):/backup \
--name worker02 centos:latest
#将压缩文件解压到/data目录下
[root@16ab804c68dd /]# tar xvf /backup/backup.tar -C /data
[root@16ab804c68ab /]# exit
挂载宿主机当前目录文件,解压从worker容器备份的文件,即完成数据迁移
4.2 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技术入门与实践》第三版(注意书中有小错误)