Docker数据管理一(数据卷 volume)

2019-03-01  本文已影响0人  平头哥2
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用`mount`挂载一个文件系统。

Docker Volume数据卷可以实现:
1)绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
2)绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。
3)数据卷可以在容器间共享和重用数据
4)数据卷可以在宿主和容器间共享数据
5)数据卷数据改变是直接修改的
6)数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。
  
Docker数据持久化:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。
如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。

一、创建一个数据卷

查看镜像

[root@langzi01 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
docker.io/tomcat     latest              168588387c68        2 weeks ago         463 MB
docker.io/ubuntu     latest              47b19964fb50        3 weeks ago         88.1 MB
docker.io/registry   latest              d0eed8dad114        4 weeks ago         25.8 MB

创建

[root@langzi01 ~]# docker run --name ubuntu -v /opt/data -t -i ubuntu:latest /bin/bash

创建文件并追加内容

root@995048cfbebb:/# cd /opt/data/
root@995048cfbebb:/opt/data# ls
root@995048cfbebb:/opt/data# echo "123" > 123
root@995048cfbebb:/opt/data# echo "123456" > 123456
root@995048cfbebb:/opt/data# ls
123  123456

退出,查看本地的系统文件:

[root@langzi01 ~]# docker inspect ubuntu|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/48acac93b3fc1d1060defe7c19f9f97ae601e24a8af99b7b9f26d632ac04a920/_data",

查看文件:

[root@langzi01 ~]# cd /var/lib/docker/volumes/48acac93b3fc1d1060defe7c19f9f97ae601e24a8af99b7b9f26d632ac04a920/_data
[root@langzi01 _data]# ls
123  123456
[root@langzi01 _data]# cat 123
123
[root@langzi01 _data]# cat 123456 
123456

向文件追加内容:

[root@langzi01 _data]# echo "aaaaaaaaaaaaaa" >> 123
[root@langzi01 _data]# cat 123
123
aaaaaaaaaaaaaa

进入容器查看文件

[root@langzi01 _data]# docker exec -it 995048cfbebb  /bin/bash
root@995048cfbebb:/# cd opt/data/
root@995048cfbebb:/opt/data# ls
123  123456
root@995048cfbebb:/opt/data# cat 123
123
aaaaaaaaaaaaaa

二、挂载宿主机文件或目录到容器数据卷

可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。

[root@langzi01 ~]# docker images
docker.io/centos     latest              1e1148e4cc2c        2 months ago        202 MB

内容:

[root@langzi01 ~]# pwd
/root
[root@langzi01 ~]# cat ip.list 
192.168.1.100
192.168.1.101
192.168.1.103

创建数据卷:

[root@localhost ~]# docker run -t -i --name test -v /root/ip.list:/centos/ip.list:ro docker.io/centos /bin/bash

--name: 指定数据卷的名字:这里为 test

-v /root/ip.list:/centos/ip.list: "宿主机文件/目录:容器里对应的文件/目录"

ro: read-only 只读: 挂载的数据默认为可读写权限,但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。如下:

[root@f0ea32bad913 /]# cat /centos/ip.list 
192.168.1.100
192.168.1.101
192.168.1.103
[root@f0ea32bad913 /]# echo "192.168.1.115" >> /centos/ip.list 
bash: /centos/ip.list: Read-only file system

在宿主机上修改共享数据

[root@langzi01 ~]# echo "192.168.1.115" >> ip.list

容器里查看数据:

[root@f0ea32bad913 /]# cat /centos/ip.list 
192.168.1.100
192.168.1.101
192.168.1.103
192.168.1.115

三、挂载宿主机目录到容器上

[root@localhost ~]# docker run -t -i --name test -v /etc:/centos/etc.list:ro docker.io/centos /bin/bash

四、挂载宿多个主机目录到容器上

[root@localhost ~]# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -t -i docker.io/ubuntu /bin/bash
上一篇下一篇

猜你喜欢

热点阅读