六、数据管理

于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

image-20210929192719878

2.2 普通数据卷

普通数据卷会将容器路径自动挂载到宿主机/var/lib/docker/volumes路径下,不需要我们提前在宿主机创建挂载目录。

1)不写数据卷名,让其随机生成卷名

这里-v选项后不写宿主机挂载目录,只写容器目录

docker run -d -P --name nginx01 -v /etc/nginx nginx

查看挂载信息

docker inspect nginx01

image-20210929204253052

可以看到不写数据卷名,docker会为我们随机生成一串字符作为数据卷名

PS:这里我修改过容器存放路径,所以不是默认的路径,关于修改容器存放路径看这篇

查看数据卷信息

docker volume ls

image-20210929200400236

2)写数据卷名(推荐使用)

这里同样不写宿主机目录,只写一个名字nginxconfig

docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx

注意这里是写的nginxconfig,不是目录
/nginxconfig才是目录

查看数据卷信息

docker volume ls

image-20210929201620004

发现有一个nginxconfig容器卷名

查看挂载信息

docker inspect nginx02

image-20210929201828204

会发现宿主机目录是一个名为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

image-20210930104100089

我这里改了docker的存放路径,方便管理,默认存放路径为/var/lib/docker/volumes/test

3)列出已有数据卷

docker volume ls

image-20210930104237161

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连接数据库

image-20210929195734994

查看数据库版本

image-20210929200042103

五、参考资料

《Docker技术入门与实践》第三版(注意书中有小错误)

狂神说docker

posted @ 2020-01-26 22:19  努力吧阿团  阅读(314)  评论(0编辑  收藏  举报