简介:


想要了解docker volume,首先我们需要知道docker的文件系统是如何工作的。docker镜像是由多个文件系统(只读层)叠加而成的。当我们启动一个容器的时候,docker会加载只读镜像层并在其上,添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那么文件将会从读写层下面的只读层复制读写层,该文件的只读版本依然存在,只是已经被读写层中该文件的副本所隐藏。当删除docker容器,并通过该镜像重新启动时,之前的更改将会失。在docker中,只读层在顶部的读写层的组合被称为union file system(联合文件系统)。

为了能够保存(持久化)数据以及共享容器间的数据,docker提出了volume的概念,简单的说,volume就是目录或者文件。它可以绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上。

volume可以将容器以及容器产生的数据分离开来,这样,当你使用docker rm 等删除容器时,不会影响相关的数据。

我们可以通过两种方式来吃实话volume,这两种方式有些细小而又重要的差别,我们可以在允许时候使用-v来声明volume:

docker管理数据的方式有两种:

数据卷---数据卷容器

数据卷是为一个或者多个容器专门指定绕过union file system(联合文件系统)的目录,为持续性或者共享数据提供了一些有用的功能。

1.数据卷时可以在容器间共享和重用

2.数据卷数据改变是直接修改的

3.数据卷书籍改变不会被包括在容器中

4.数据卷是持续性的,直到没有容器使用它

数据卷的使用,类似于linux下对目录进行mount

挂载一个主机目录作为数据卷

如果想在容器中使用主机上面的某个目录,你可以通过-v参数来指定。

docker run  -v /host/path:/some/path...

这明确的告诉docker使用指定的主机路径来代替docker自己创建的根路径并挂载到容器内指定的路径,需要注意。如果主机上的路径不存在,目录将自动在给定的路径中创建

1.我们先简单用dockerfile创建一个http的镜像


[root@kang ~]# mkdir /dockerhttp  
[root@kang ~]# cd /dockerhttp/
[root@kang dockerhttp]# vim Dockerfile


绿联云docker不开机自动启动 docker lvm_shell

绿联云docker不开机自动启动 docker lvm_shell_02

FROM docker.io/centos:latest
RUN yum install -y httpd
RUN sed -i 's/#ServerName www.example.com:80/ServerName www.blxh.com/'g /etc/httpd/conf/httpd.conf
expose 80
cmd ["/usr/sbin/httpd","-DFOREGROUND"]

绿联云docker不开机自动启动 docker lvm_web_03

[root@kang dockerhttp]# docker build -t="centos:http" .    //运行

 

绿联云docker不开机自动启动 docker lvm_mysql_04

绿联云docker不开机自动启动 docker lvm_绿联云docker不开机自动启动_05

运行结束后docker image查看镜像是否有httpimage

绿联云docker不开机自动启动 docker lvm_shell_06


2.创建一个web容器,并加载一个宿主目录到容器的/var/www/html/目录

在宿主机上创建/web/webapp1目录,并且创建一个index.html文件:

[root@kang ~]# mkdir -p /web/webapp1
[root@kang ~]# vim /web/webapp1/index.html

绿联云docker不开机自动启动 docker lvm_shell_07

3.使用镜像创建容器:

[root@kang ~]# docker run -dit -p 80:80 -v /web/webapp1/:/var/www/html/ centos:http

绿联云docker不开机自动启动 docker lvm_docker_08

[root@kang ~]# docker ps

绿联云docker不开机自动启动 docker lvm_绿联云docker不开机自动启动_09

上面的命令加载主机的/web/webapp1目录到容器的/var/www/html目录。这个功能在进行测试的时候十分方便,比如用户可以设置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在docker会自动为你创建它

这时候我们去访问网页,如果出现zhu da jia mei tian kai kai xin xin页面证明成功。

绿联云docker不开机自动启动 docker lvm_docker_10

二、创建一个数据卷

volume可以使用以下两种方式创建:

1.在dockerfile中指定volume /some/dir

2.执行docker run -v /some/dir命令来指定

无论哪种方式都是做了同样的事情,它们告诉docker在主机创建一个目录,然后将其挂载到指定的路径下,当删除使用该volume的容器时volume本身不会受到影响,它可以一直存在下去

创建数据卷绑定到新新建容器,新建容器中会创建/data数据卷


[root@kang ~]# docker run -dit -v /data centos:http

绿联云docker不开机自动启动 docker lvm_mysql_11

进入容器,查看给容器添加的数据卷

绿联云docker不开机自动启动 docker lvm_绿联云docker不开机自动启动_12

创建的数据卷可以通过 docker inspect查看

绿联云docker不开机自动启动 docker lvm_绿联云docker不开机自动启动_13

这说明docker把/var/lib/docker下的某个目录挂载到了容器内的/data目录下。

我们从主机上添加文件到此文件夹下:


[root@kang ~]# cd /var/lib/docker/volumes/dc8a1570bb86a429649a4e1fb13a6c0ca6b9d408cef77b7b11992ee1b03c2735/_data/
[root@kang _data]# touch kangshuo.txt
[root@kang _data]# vim kangshuo.txt

绿联云docker不开机自动启动 docker lvm_mysql_14

之后我们进去容器查看是否有kangshuo.txt

绿联云docker不开机自动启动 docker lvm_mysql_15

docker挂载的数据卷的默认权限是读写,用户也可以通过:ro指定为只读

绿联云docker不开机自动启动 docker lvm_docker_16

数据卷容器
如果要授权一个容器访问另一个容器的volume,我们可以使用--volumes-from参数来执行,如果你有一些持久性的数据并且想在容器间共享,可以创建一个数据卷容器,然后从容器上挂载数据
常见的使用场景是使用纯数据容器来持久数据库,配置文件或者数据文件等。
例如:
docker run --name dbdata postgres echo "data-only container for postgres"
该命令将会创建一个已经包含在dockerfile里定义volume镜像,我们可以使用--volume-from命令来识别其他容器的volume

绿联云docker不开机自动启动 docker lvm_mysql_17

使用--volume-from选项在另外一个容器中挂载 /test卷。不管data容器是否在运行,其他容器都可以挂载该容器的数据卷,当然如果是单独的数据卷就没必要运行容器的

绿联云docker不开机自动启动 docker lvm_shell_18

查看挂载点

绿联云docker不开机自动启动 docker lvm_绿联云docker不开机自动启动_19

到这里有关于Docker技术剖析--docker数据卷(LVM)配置就演示完毕了!!!!

希望对你有所帮助!!!@再见!!!!