一、数据类型
Docker的镜像是分层设计的,底层是只读的,通过镜像其的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层当中,如果要将写入的数据永久生效,需要将其提交为一个镜像然后通过这个镜像在启动实例,然后就会给这个启动的实例添加一层可读写的文件系统,目前Docker的数据类型分为两种,一是数据卷,二是数据容器,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上。
二、数据优点
1、数据在多个容器之间共同使用 2、对数据卷更改数据容器里面会立即更新 3、数据卷的数据可以持久保存 4、数据的更新不会影响镜像本身,即使删除容器也不会丢失数据卷里面的数据,除非是有docker-fv –vvv参数 #创建容器时候指定-v参数,删除容器的时候也指定-v 可以删除data的数据
三、开始测试
1、创建宿主机数据
[root@1 ~]# mkdir /data/docker -p
[root@1 ~]# echo 'liangzeyu666' >/data/docker/docker-data.txt
2、启动容器进行测试
[root@1 ~]# docker run -d --name test-nginx-date -v /data/docker/:/tmp/ jack/centos-nginx:v1 nginx
d4ef1ddae5303d186a15b555a5876136fb02e404bcb06c7baae50f603e34c572
3、进入容器进行测试
[root@1 ~]# docker inspect -f "{{.State.Pid}}" d4ef1ddae530
5936
[root@1 ~]# nsenter -t 5936 -m -i -u -p
[root@d4ef1ddae530 /]# cd /tmp/
[root@d4ef1ddae530 tmp]# ls
docker-data.txt
[root@d4ef1ddae530 tmp]# cat docker-data.txt
liangzeyu666
4、在容器中进行读写数据
[root@d4ef1ddae530 tmp]# echo 'liangzeyu777' >>/tmp/docker-data.txt
[root@d4ef1ddae530 tmp]# exit
logout
[root@1 ~]# cat /data/docker/docker-data.txt
liangzeyu666
liangzeyu777
5、删除数据卷挂载的容器
#创建容器的时候指定-v,删除容器的时候不使用-v,可以保留磁盘数据
[root@1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4ef1ddae530 jack/centos-nginx:v1 "nginx" 7 minutes ago Up 7 minutes test-nginx-date
[root@1 ~]# docker rm -f d4ef1ddae530
d4ef1ddae530
[root@1 ~]# cat /data/docker/docker-data.txt
liangzeyu666
liangzeyu777
6、如何避免挂载文件被修改
#挂载目录的时候指定只读权限,默认是rw,只读是ro:
docker run -d --name data-test-vm -v /docker/data/docker-data.txt:/docker/data/docker-data.txt:ro jack/nginx-1.10.3:v1
7、如何避免目录被修改
docker run -d --name data-test-vm1 -v /docker/data:/docker/data:ro jack/nginx-1.10.3:v1 nginx
8、一次挂载多个目录
docker run -d --name test-data-vm -v /testfile/:/data -v /docker1:/data1 -v /docker:/docker jack/nginx-1.10.3:v1 nginx
四、数据卷容器
数据卷容器最大的功能是可以让数据在多个docker容器之间共享,即可以让A容器访问B容器的内容,而B也可以访问A容器的内容,即先要创建一个后台运行的容器,用于卷提供,这个卷可以为其他容器提供数据存储服务:数据卷容器最大的功能是可以让数据在多个docker容器之间共享,即可以让A容器访问B容器的内容,而B也可以访问A容器的内容,即先要创建一个后台运行的容器,用于卷提供,这个卷可以为其他容器提供数据存储服务。
1、启动一个卷容器server
[root@1 ~]# mkdir docker
[root@1 ~]# mkdir docker1
[root@1 ~]# mkdir testfile
创建3个目录[root@1 ~]# docker run -d --name test-file -v /root/docker/:/data/ -v /root/docker1/:/opt/ -v /root/testfile/:/docker/ jack/centos-nginx:v1 nginx
445209bd9b959e76aa684711994c2e07d6c7522b32dd345976d3fcc50a2bbc7a
2、启动客户端
--volumes-from test-file
[root@1 ~]# docker run -d --name test-client --volumes-from test-file jack/centos-nginx:v1 nginx
c73598cf917e7c31bd35cb0a3c80a158c500a3c5b4d63713c40f578d02fdf619[root@c73598cf917e /]# ls /opt/
[root@c73598cf917e /]# mkdir /opt/123123123
[root@c73598cf917e /]# exit
logout
[root@1 ~]# ls /root/docker1/
123123123
#在当前环境下,即使把提供卷的容器Server删除,已经运行的容器Client依然可以使用挂载的卷,因为容器是通过挂载访问数据的,但是无法创建新的卷容器客户端,但是再把卷容器Server创建后即可正常创建卷容器Client,此方式可以用于线上数据库环境,因为即使数据库的容器被删除了,其他已经运行的容器依然可以挂载使用
#数据卷容器可以作为共享的方式为其他容器提供文件共享,类似于NFS共享,可以在生产中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各容器之间的数据一致性。
有问题请加博主微信进行沟通!
全部评论