Docker技术剖析--docker数据卷

想要了解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@docker-yk ~]# mkdir        /dockerhttp

[root@docker-yk ~]#cd /dockerhttp/
[root@docker-yk dockerhttp]# vim Dockerfile
[root@docker-yk dockerhttp]# cat Dockerfile 
FROM docker.io/centos:latest
RUN yum install -y httpd
RUN sed -i 's/#ServerName www.example.com:80/ServerName www.yankerp.com/'g /etc/httpd/conf/httpd.conf
expose 80
cmd ["/usr/sbin/httpd","-DFOREGROUND"]

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

 

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

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

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

3.使用镜像创建容器:

[root@docker-yk ~]# docker run -dit -p 80:80 -v /web/webapp1/:/var/www/html/ centos:http
8afaefe406bcb82cd51c708db45d362e95f52f8a2c1be72a3e4c70ae2a2fca6c
[root@docker-yk ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
8afaefe406bc        centos:http         "/usr/sbin/httpd -DFO"   6 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   happy_leavitt

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

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

二、创建一个数据卷

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

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

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

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

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

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

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

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

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

[root@localhost ~]# cd /var/lib/docker/volumes/d34031dcf5cd9630b66b018151dc4878a0b142d61438b226c51a525a9075752b/_data
[root@localhost _data]# touch yankai.txt
[root@localhost _data]# vim yankai.txt 
[root@localhost _data]# cat yankai.txt 
hello docker

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

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

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

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

查看挂载点

希望对您有所帮助。再见

 

延瓒@yankerp CSDN认证博客专家 通俗易懂
相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页
实付 59.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值