Docker 数据卷操作的实现

数据卷入门

在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能还是稍微有点差,没有办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?有!

数据卷可以绕过拷贝系统,在多个容器之间、容器和宿主机之间共享目录或者文件,数据卷绕过了拷贝系统,可以达到本地磁盘 I/O 性能。

本文先通过一个简单的案例向读者展示数据卷的基本用法。

以前面使用的 nginx 镜像为例,在运行该容器时,可以指定一个数据卷,命令如下:

docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 bc26f1ed35cf

运行效果如下:

此时,我们创建了一个数据卷并且挂载到容器的 /usr/share/nginx/html/ 目录下,小伙伴们知道,该目录实际上是 nginx 保存 html 目录,在这里挂载数据卷,一会我们只需要修改本地的映射位置,就能实现页面的修改了。

接下来使用 docker inspect 命令查看刚刚创建的容器的具体情况,找到数据卷映射目录,如下:

可以看到,Docker默认将宿主机的 /var/lib/docker/volumes/0746bdcfc045b237a6fe2288a3af9d7b80136cacb3e965db65a212627e217d75/_data 目录作为source目录,接下来,进入到该目录中,如下:

此时发现该目录下的文件内容与容器中 /usr/share/nginx/html/ 目录下的文件内容一致,这是因为挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中(如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉)。

小贴士:

由于 Mac 中的 Docker 有点特殊,上文提到的 /var/lib/xxxx 目录,如果是在 linux 环境下,则直接进入即可,如果是在 mac 中,需要首先执行如下命令,在新进入的命令行中进入到 /var/lib/xxx 目录下:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

接下来修改改文件中的index.html文件内容,如下:

echo "hello volumes">index.html

修改完成后,再回到浏览器中,输入 http://localhost查看nginx中index.html 页面中的数据,发现已经发生改变。说明宿主机中的文件共享到容器中去了。

结合宿主机目录

上文中对于数据卷的用法还不是最佳方案,一般来说,我们可能需要明确指定将宿主机中的一个目录挂载到容器中,这种指定方式如下:

docker run -itd --name nginx -v /Users/sang/blog/docker/docker/:/usr/share/nginx/html/ -p 80:80 bc26f1ed35cf

这样便是将宿主机中的 /Users/sang/blog/docker/docker/ 目录挂载到容器的 /usr/share/nginx/html/ 目录下。接下来读者只需要在 /Users/sang/blog/docker/docker/ 目录下添加 html 文件,或者修改 html 文件,都能在 nginx 访问中立马看到效果。

这种用法对于开发测试非常方便,不用重新部署,重启容器等。

注意:宿主机地址是一个绝对路径

更多操作

Dockerfile中的数据卷

如果开发者使用了 Dockerfile 去构建镜像,也可以在构建镜像时声明数据卷,例如下面这样:

FROM nginx
ADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/
RUN echo "hello docker volume!">/usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html/

这样就配置了一个匿名数据卷,运行过程中,将数据写入到 /usr/share/nginx/html/ 目录中,就可以实现容器存储层的无状态变化。

查看所有数据卷

使用如下命令可以查看所有数据卷:

docker volume ls

如图:

查看数据卷详情

根据 volume name 可以查看数据详情,如下:

docker volume inspect

执行结果如下图:

删除数据卷

可以使用 docker volume rm 命令删除一个数据卷,也可以使用 docker volume prune 批量删除数据卷,如下:

批量删除时,未能删除掉所有的数据卷,还剩一个,这是因为该数据卷还在使用中,将相关的容器停止并移除,再次删除数据卷就可以成功删除了,如图:

数据卷容器

数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用。所谓的数据卷容器,实际上就是一个普通的容器,举例如下:

  • 创建数据卷容器

使用如下方式创建数据卷容器:

docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu

命令执行效果如下图:

  • 引用容器

使用如下命令引用数据卷容器:

docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx
docker run -itd --volumes-from mydata -p 81:80 --name nginx2 nginx

此时, nginx1 和 nginx2 都挂载了同一个数据卷到 /usr/share/nginx/html/ 目录下,三个容器中,任意一个修改了该目录下的文件,其他两个都能看到变化。

此时,使用 docker inspect 命令查看容器的详情,发现三个容器关于数据卷的描述都是一致的,如下图:

总结

本文主要向大家介绍了数据卷中的容器操作,整体来说还是非常简单的,小伙伴们,你学会了吗?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈docker学习之docker数据卷(volume)

    1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们需要明确Docker内的文件系统是如何工作的.Docker镜像被存储在一系列的只读层.当我们开启一个容器,Docker读取只读镜像并添加一个读写层在顶部.如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层.在读写层中的旧版本文件隐藏于该文件之下,但并没有被不破坏 - 它仍然存在于镜像以下.当Docker的容器被删除,然后重新启动镜像时,将开启一个没有任何更改的新的容器 - 这些更改会丢失

  • Docker中容器数据卷(Data Volume)和数据管理详解

    卷(Volume) 众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像. 一.数据卷 数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录.卷为提供为持久化或共享数据提供了一些有用的特性. 数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关.因此,在删除容器时,Docker不会自动删除卷,直到没有容器再

  • 详解Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 1.数据卷(Data Volumes):容器内数据直接映射到本地主机环境:如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中. 2.数据卷容器(Data Volume Containers):使用特定容器维护数据卷.如何使用数据卷容器在容器和主机.容器和容器之间共享数据,并实现数据的备份和恢复. 数据卷 数据卷是一个可

  • Docker 数据卷及数据容器详细介绍及示例

    Docker 数据卷及数据容器 这两天开始学习docker,发现docker确实很强大,让网站部署和维护的效率大大提高.遂准备将手头维护的几个小站,全部docker化.整理的过程中感觉到,docker可以以功能或者进程为单位进行部署和维护,不用再花时间在繁琐的配置上面,但是docker和宿主之间的数据共享以及docker间的数据共享仍然是让人头疼和操心的地方. 几个基本概念: docker: 一种容器管理技术,这里也指既有的开发工具链. container: 容器 image: 镜像 volum

  • 详解Docker 数据卷管理

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享. 数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像.使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统. 本节中,我们需要依次完成下面几项任务: 1.创建数据卷 2.管理数据卷权限 3.挂载宿主机文件 4.使用数据卷容器共享数据 5.数据卷备份

  • Docker 数据卷,数据卷容器详细介绍

    Docker 数据卷,数据卷容器详细介绍 引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(moun

  • docker 数据卷之进阶篇

    笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前文的基础上介绍 docker 数据卷的原理及一些高级用法.如果您想先了解 docker 数据卷的基本概念与用法,请先移步这里. 为什么需要数据卷? 这得从 docker 容器的文件系统说起.出于效率等一系列原因,docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题: 不能在宿主机上很方

  • Docker 数据卷权限实例详解

    Docker 数据卷权限 在CentOS7中运行NodeJs的容器,发现挂载的本地目录在容器中没有执行权限,经过各种验证和Google搜索,找到了问题的原因,这里做一下记录.原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题: 1,在运行容器的时候,给容器加特权: 示例:docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.12.0 2,临时

  • 浅谈Docker 容器数据卷挂载小结

    为了更直观了解数据卷挂载的操作,做个实验一一验证数据卷挂载的各种情况. 情况一.本地不存在文件挂载到容器存在文件 首先是当本地不存在该文件,而容器内存在该文件的情况,尝试把不存在的文件挂载到存在该文件的容器中.以一个 Alpine 镜像为例,这里把一个修改后的 Alpine 镜像打了新标签,叫做 volume_test: # 本地目录不存在 test 文件. $ docker run --name=test -v ~/test.txt:/etc/hosts -d volume_test 0cba

  • Docker 数据卷操作的实现

    数据卷入门 在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能还是稍微有点差,没有办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?有! 数据卷可以绕过拷贝系统,在多个容器之间.容器和宿主机之间共享目录或者文件,数据卷绕过了拷贝系统,可以达到本地磁盘 I/O 性能. 本文先通过一个简单的案例向读者展示数据卷的基本用法. 以前面使用的 nginx 镜像为例,在运行该容器时,可以指定一个数据卷,命令如下: docker run -itd --n

  • Docker数据卷和容器编排的使用

    前言 Docker 数据卷和容器编排,记录下来! 数据卷 数据卷可以绕过拷贝系统,在多个容器之间.容器和宿主机之间共享目录或文件,数据卷绕过了拷贝系统,可以达到本地磁盘I/O性能. 运行容器时,指定一个数据卷 $ docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 e445ab08b2be 此时,我们创建了一个数据卷并且挂载到容器的/usr/share/nginx/html/目录下. 使用 docker inspect

  • Docker数据卷常用操作代码实例

    如果开发者使用了Dockerfile去构建镜像,也可以在构建镜像时声明数据卷,例如下面这样: FROM nginx ADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/ RUN echo "hello docker volume!">/usr/share/nginx/html/index.html VOLUME /usr/share/nginx/html/ 这样就配置了一个匿名数据卷,运行过程中,将数据

  • Docker数据卷容器创建及使用方法解析

    数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用.所谓的数据卷容器,实际上就是一个普通的容器,举例如下: 创建数据卷容器 使用如下方式创建数据卷容器: docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu 命令执行效果如下图: 引用容器 使用如下命令引用数据卷容器: docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx

随机推荐