为了能够存储持久化数据以及共享容器间的数据,Docker提出了Volume的概念。让我们通过类似mount的方式将宿主机的文件或者目录挂载到容器中。

在容器中管理数据主要有两种方式:

  • 数据卷(Data volumes)

  • 数据卷容器(Data volume containers)

数据卷

创建一个数据卷

在使用docker run命令的时候,使用-v选项创建一个数据卷并挂载到容器里。

下面创建一个测试容器nginx,并加载一个数据卷到容器的/data目录。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test1 -v /data nginx

容器启动后,登录到容器会发现/data目录是空的。

[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
root@00741a2a44ad:/# ls -l /data
total 0

上面的命令会挂载一个data目录到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像/data 路径的文件会将被复制到Volume。那么在我们宿主机上,这个目录到底在哪里呢。

我们可以使用 docker inspect 命令找到Volume在主机上的存储位置:

[root@linux-node1 ~]# docker inspect -f {{.Mounts}} nginx-volume-test1

[{861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159
/var/lib/docker/volumes/861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159/_data
/data local true }]

你会发现,容器中的/data目录实际上挂载到了/var/lib/docker/volumes/容器ID/_data的目录下。

我们现在在宿主机该目录下创建一个文件。

[root@linux-node1 _data]# touch mount-test

我们再次在容器中查看,发现已经有了。

[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
root@00741a2a44ad:/# ls -l /data
total 0
-rw-r--r-- 1 root root 0 Sep 2 18:58 mount-test

指定一个宿主机目录作为数据卷

有的时候,我们需要将宿主机的某个目录挂载到容器中来进行访问,可以通过-v 源路径:目标目录的方式进行。

[root@linux-node1 ~]# mkdir -p /data/docker-volume-nginx
[root@linux-node1 ~]# docker run -d --name nginx-volume-test2 \
-v /data/docker-volume-nginx:/data nginx

你会发现,目前容器中的/data目录和宿主机中的/data/ docker-volume-nginx目录是相同的。

文件挂载

数据卷也可以挂载一个宿主机的文件作到容器中作为数据卷。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test3 \
-v /$HOME/.bash_history:/root/.bash_history nginx

上面案例将宿主机的.bash_history挂载到了容器中,这样就可以记录容器中的命令历史记录。

只读挂载

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

[root@linux-node1 ~]# docker run -d --name nginx-volume-test \
-v /data/docker-volume-nginx:/data:ro nginx

数据卷生产实践

那么这种将本地的目录挂载到容器中的方法,在生产中有哪些应用场景呢?

在开发环境中

在基于Docker的开发环境中,例如我们将本地的/home/code目录挂载到容器中的/data/webroot,然后容器的应用的webroot同样设置为/data/webroot,那么容器启动后,我们就可以自由的本地进行代码的编写和调试,对于解释性的语言,就比较方便了。如果你的Docker运行在虚拟机中,可以先将本地例如D:code目录通过虚拟机软件共享到虚拟机里,目前VirtualBox和Vmware workstation都支持目录映射。在Vmware中需要在虚拟机中安装Vmware Tools。

在生产环境中

如果我们的容器里面运行的程序需要写一些持久化的数据到硬盘,或者共享宿主机的一些文件或者目录,显然这种数据卷的挂载非常的方便。

不过数据卷最大的缺陷应该是不灵活了,因为Docker的理念是Build、Ship、Run。因为有这个挂载目录的依赖,那么这个Docker镜像在新的宿主机上运行就需要考虑挂载的目录是否存在等问题。

数据卷容器

Docker还支持让一个容器访问另一个容器的Volume,我们可以使用 -volumes-from 参数挂载其它容器的卷。

[root@linux-node1 ~]# docker run -d --name nginx-volume-test4 \
--volumes-from nginx-volume-test1 nginx
7d650d332e3d9bf4086be35ae5a04b618f9d8e1df03fa2fef5f5766318a4ca12
[root@linux-node1 ~]# ./docker_in.sh nginx-volume-test4
root@7d650d332e3d:~# ls /data
mount-test

注意:不管数据卷容器nginx-volume-test1是否运行,nginx-volume-test4都可以访问到nginx-volume-test1里面挂载的数据卷。所以说数据卷容器,其实就是一个普通的容器,只不过是专门用来提供数据卷供其它容器挂载使用的。

数据卷容器生产实践

在生产中使用数据卷容器的方案有很多,一个非常典型的就是在进行日志收集的时候。我们可以在一台服务器上启动一个logstash或者filebeat的容器log-volume,然后其它所有应用容器启动都使用--volumes-from log-volume,将日志写入对应路径,然后使用统一收集,这样就避免在所有需要进行日志收集的容器中去部署logstash。相对于直接挂载本地目录也更加的方便。

5、Docker数据管理的更多相关文章

  1. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

  2. Docker学习之Docker镜像基本使用

    Docker学习之Docker镜像基本使用 获取镜像 命令格式:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 例如: docker pull ...

  3. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  4. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  5. Docker学习笔记 - Docker的守护进程

    学习目标:  查看Docker守护进程的运行状态 启动.停止.重启Docker守护进程 Docker守护进程的启动选项 修改和查看Docker守护进程的启动选项 1.# 查看docker运行状态  方 ...

  6. Docker学习笔记 - Docker客户端和服务端

    学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc   ...

  7. Docker学习之Docker Registry

    前言 前面已经学习了怎样通过Dockerfile来构建我们自己的镜像了,但是一个系统可能包含着很多个微服务即有很多个镜像,当镜像越来越多的时候,就必须得有一个地方来管理这些镜像,Docker官方提供了 ...

  8. Docker学习:Docker安装和基本使用

    Docker Docek是一种容器技术.容器是一种轻量级.可移植.自打包的软件技术,使应用程序可以在几乎任何地方以相同的方式运行. 使用者可以在笔记本上创建并测试好的容器,无需任何修改就能够在生产系统 ...

  9. Docker学习之docker架构

    docker架构 解释 1.docker命令提交给docker daemon进行处理,可以拖取镜像,运行容器等等. 2.最右边的实际上是互联网的sass服务,docker daemon可以和Regis ...

  10. DOCKER学习_016:Docker镜像仓库和HARBOR的简单安装和管理

    一 镜像仓库介绍 1.1 简介 镜像仓库用于存放 Docker镜像 Docker registry提供镜像仓库服务 一个 Docker registry可以包含多个镜像仓库 仓库分为公共镜像仓库与私有 ...

随机推荐

  1. java.lang.Double.byteValue() 方法

    java.lang.Double.byteValue() 方法(通过转换成一个字节)返回此Double为一个字节的值. 声明 以下是java.lang.Double.byteValue()方法的声明 ...

  2. 022_IO流

    对象流 // FileInput.FileOutputStream(节点流)ObjectInputStreamObjectOutputStream 序列化 把内存的数据信息永久的保存在硬盘中,这个过程 ...

  3. Django的日常-数据传输

    目录 Django的日常-1 Django中最常用的三个东西 HTTPresponse render redirect 静态文件相关 form表单的get与post 神奇的request 模板的传值方 ...

  4. 1-vim-简介

    vi(visual interface)是Linux最经典的文本编辑器 vi的核心设计思想-让程序员的手指始终保持在键盘的核心区域,就能完成所有的编辑操作. vi的特点 没有图形界面 只能编辑文本内容 ...

  5. hdu6341 /// 模拟 DFS+剪枝

    题目大意: 将16行16列的矩阵分成四行四列共16块 矩阵的初始状态每行及每列都不会出现重复的元素 给定一个已旋转过某些块的矩阵 判断其是由初始状态最少经过几次旋转得到的 DFS枚举16个块的旋转方式 ...

  6. linux 两个进程通过 共享内存 通信例子

    例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...

  7. pandas--层次化索引

    层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别. 创建一个Series,并用一个由列表或数组组成的列表作为索引. data=Series(np.random.r ...

  8. IIS查找报错信息

    1.打开IIS,选择日志 2.选择 日志文件和ETW事件   ---->应用 3.在发布网站的根目录下找一个logs文件(如果没有则创建) 4.浏览网站,如果报错,logs文件夹下面就会生成一个 ...

  9. ps切图的基本操作

    参考线和辅助线 ctrl+r呼出标尺,只有在移动工具(快捷键v)下,鼠标左键从标尺上可以拖出来新的参考线.将参考线拖回标尺即是删除. 导出切片 快捷键ctrl+alt+shift+s ,选择png-2 ...

  10. vue在v-for循环中绑定v-model

    原始示例 <div v-for="item in items"> <input type="text" v-model="'good ...