一、前言
当我们使用Docker创建一个mysql的container, 数据是存储在container内的.
如果有一天不小心执行了docker rm $(docker ps -aq)删除所有container. 那么mysql里的数据也会被删掉, 这是不安全的.
我们需要将数据持久化, 存储在container外部. 即使删除container也不会删除原有的数据.
二、容器的缺陷
容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题:
1.数据不是持久化。意思是如果容器删除了,这些数据也就没了
2.主机上的其它进程不方便访问这些数据
3.对这些数据的I/O会经过存储驱动,然后到达主机,引入了一层间接层,因此性能会有所下降
三、data volume有两种挂载方式:
**1)bind mount(用户管理):**将宿主机上的某个目录或文件(不可以是没有格式化的磁盘文件),挂载到容器中,默认在容器内对此目录是有读写权限的,如果只需要向容器内添加文件,不希望覆盖目录,需要注意源文件必须存在,否则会被当做一个目录bind mount给容器。
**2)docker manager volume(docker自动管理):**不需要指定源文件,只需要指定mount point(挂载点)。把容器里面的目录映射到了本地。
这种方式相比bind mount 缺点是无法限制对容器里边目录或文件的权限。
使用第二种挂载方式,-v 挂载时,不指定源文件位置,则默认挂载的路径是:
[root@sqm-docker01 _data]# pwd
/var/lib/docker/volumes/dd173640edd5b0205bb02f3c4139647be12528b38289b9f93f18123a6b1266a8/_data
#当有目录挂载时,默认在/var/lib/docker/volumes/下会生成一串hash值,hash值下有一个_data的目录,容器内映射的文件就在此路径下。
四、Storage Driver
数据存储方式
Centos7版本的docker,Storage Driver(数据存储方式)为:overlay2 ,Backing Filesystem(文件系统类型): xfs
可使用 “docker inspect 容器名称” 来查看数据存储方式
五、Data Volume
(Bind mount)
持久化存储:本质上是DockerHost文件系统中的目录或文件,能够直接被Mount到容器的文件系统中。在运行容器时,可通过-v实现。
特点:
1、Data Volume是目录或文件,不能是没有格式化的磁盘(块设备)。
2、容器可以读写volume中的数据。
3、Volume数据可以永久保存,即使使用它的容器已经被销毁。
小实验:
运行一个nginx服务,做数据持久化
(1)Data Volume是目录或文件,不能是没有格式化的磁盘(块设备)。
[root@docker01 ~]# mkdir html
//创建测试目录
[root@docker01 ~]# cd html/
[root@docker01 html]# echo "This is a testfile in dockerHost." > index.html
//创建测试网页
[root@docker01 ~]# docker run -itd --name testweb -v /root/html/:/usr/share/nginx/html nginx:latest
//运行一个nginx容器,并挂载目录
[root@docker01 ~]# docker inspect testweb
[root@docker01 ~]# curl 172.17.0.3
注意:dockerhost上需要被挂载的源文件或目录,必须是已经存在,否则,会被当作一个目录挂载到容器中。
(2)容器可以读写volume中的数据。
[root@docker01 ~]# docker exec -it testweb /bin/bash
root@ef12d312a94e:/# cd /usr/share/nginx/html/
root@ef12d312a94e:/usr/share/nginx/html# echo "update" > index.html
//容器中更新网页
root@ef12d312a94e:/usr/share/nginx/html# exit
[root@docker01 ~]# cat html/index.html
//可以看到宿主目录的挂载目录也更新了
(3)Volume数据可以永久保存,即使,使用它的容器已经被销毁,也可以通过宿主机的挂在目录重新启动一个容器挂载这个目录进行访问。
[root@docker01 ~]# docker ps -a -q |xargs docker rm -f //删除所有容器