docker数据管理(11)

1435人浏览 / 0人评论

一、数据类型

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共享,可以在生产中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各容器之间的数据一致性。

全部评论