介绍
在本文中,我们将介绍Docker数据卷的概念:它们是什么,为什么它们有用,不同类型的卷,如何使用它们以及何时使用它们。 我们还将经历如何通过使用Docker卷的一些例子docker
命令行工具。
当我们到达文章的结尾,你应该很容易创建和使用任何类型的Docker数据卷。
先决条件
要遵循本教程,您需要以下内容:
- Ubuntu 14.04 Droplet
- 使用sudo特权的非root用户( 与Ubuntu 14.04初始服务器设置介绍了如何设置起来。)
- 从第1步中的说明进行安装Docker如何在Ubuntu 14.04安装和使用Docker Compose
注意:即使先决条件给出了在Ubuntu 14.04安装Docker指令, docker
在这篇文章中的泊坞数据量的命令应该只要Docker就是安装其他操作系统的工作。
解释Docker容器
使用Docker需要了解一些Docker特定的概念,大多数文档都集中在解释如何使用Docker的工具集,而不需要解释为什么要使用任何这些工具。 如果你是新的Docker,这可能会令人困惑,所以我们将开始通过一些基础知识,然后跳入使用Docker容器。 如果您以前使用过Docker,只想了解如何开始使用数据卷,请随时跳到下一节。
Docker容器类似于虚拟机。 它基本上允许您在容器中运行预打包的“Linux盒”。 Docker容器和典型虚拟机之间的主要区别是,Docker与周围环境的隔离不如普通虚拟机。 Docker容器与主机操作系统共享Linux内核,这意味着它不需要“引导”虚拟机的方式。
由于这么多的共享,启动一个Docker容器是一个快速和便宜的操作 - 在大多数情况下,你可以提出一个完整的Docker容器(相当于一个正常的虚拟机),在运行正常命令行程序。 这是伟大的,因为它使部署复杂的系统更容易和更模块化的过程,但它是一个不同的范例,从通常的虚拟机方法,并有一些意想不到的副作用,来自虚拟化世界的人。
了解Docker数据卷
最大的困惑是Docker文件系统在默认情况下是临时的。 如果你启动一个Docker镜像,你会得到一个容器,在表面上的行为很像一个虚拟机。 您可以创建,修改和删除文件到您的心脏的内容。 但是,如果您停止容器并重新启动,所有更改将会丢失:之前删除的所有文件现在都将恢复,并且您创建的所有新文件或修改都不会显示。 这是因为Docker形象更像比标准虚拟化世界般的画面模板。
Docker图像是组成应用程序的文件。 例如,如果你下载的DockerNginx的图像从泊坞中心(市民Docker登记处),你就可以下载一个包含了最小的Linux发行版和Nginx的本身需要运行的二进制图像。 容器就像位于此图像顶部的另一个图层,而不会修改原始图像本身。 如果您熟悉VirtualBox或其他虚拟化工具中快照的概念,这种方法的工作方式类似。 要保存您的更改,您实际上必须创建一个新的Docker镜像(不是容器),其中包含新更改的文件。
这很好,如果你有兴趣创建新的Docker图像,但如果你只是想做一些事情,如使用公共Nginx Docker图像来服务您自己的网页? 每次启动Docker容器时,必须将您的网页复制到位,远远不够理想。 这是数据卷进来。Docker数据量为您提供一个单独的地方来存储的其他数据。 你可以告诉Docker使用任何文件夹作为容器,从那时起写入该位置的任何文件都将被持久化。
工作无Docker数据卷
我们前面提到,Docker容器中的文件是临时的。 这是一个奇怪的概念,所以让我们花一秒钟来看看行动中的问题。 如果你已经看到文件意外地从你的Docker容器中消失,只是想知道如何解决它,然后继续下一步。
让我们运行一个基本的ubuntu
形象,看我们是如何创建的文件当容器被杀害消失。
docker run -t -i ubuntu /bin/bash
这个命令一次做了一堆东西。 该run
与部分-t -i
选项告诉泊坞准备与终端运行在交互模式下的图像。 在ubuntu
命令行选项是运行图像的名称和/bin/bash
是,我们要启动该图像内的可执行文件的名称。 Docker会自动尝试下载它不能从本地市民泊坞登记寻找图片,所以运行此命令将导致Docker下载从Docker注册一个Ubuntu图像,然后启动bash
里面,这给了我们一个标准的外壳。
提示将更改为类似于:
Ubuntu container bash shellroot@cbceb444ec6a:/#
让我们继续写一个文件到Docker容器中的文件系统的根目录:
echo "I'm going to disappear" > /byebye
你可以看到,文件/byebye
创建,其内容是通过平时的shell命令存在。 例如,在bash shell为你的Ubuntu容器内,如果你列出的内容/
用命令目录:
ls /
您将看到以下内容:
Output of ls /bin boot byebye dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
如果您发出命令:
cat /byebye
您将看到以下内容:
Output of `cat /byebye`I'm going to disappear
来吧,键入exit
现在的壳,你会被跌回您的主机系统的外壳。
现在,回到向上滚动,再次重复本节中的步骤,但不创建文件/byebye
一次。 你会看到它不再存在。 例如,命令:
cat /byebye
现在显示以下内容:
Output of cat /byebyecat: /byebye: No such file or directory
一定要从Ubuntu容器bash shell退出:
exit
学习Docker数据卷的类型
Docker数据卷有三个主要用例:
- 保持数据,即使通过容器重新启动
- 在主机文件系统和Docker容器之间共享数据
- 与其他Docker容器共享数据
第三种情况是稍微更高级,所以我们不会在这个教程中,但前两个是相当普遍。
在第一种(也是最简单的)情况下,即使您关闭或重新启动容器,也只是希望数据挂起,所以通常最容易让Docker管理数据存储的位置。
保持数据持久
有没有办法直接创建一个Docker“数据量”,所以不是我们创建连接到它的容积的数据容量的容器 。 对于任何其他容器,你再要连接到这个数据量的容器,使用Docker--volumes-from
选项抓住从这个容器的体积,并将其应用到当前的容器。 这是乍一看有点不寻常,让我们通过我们如何使用这种方法,使我们的一个简单的例子运行byebye
文件坚持围绕即使容器重新启动。
首先,创建一个新的数据卷容器来存储我们的卷:
docker create -v /tmp --name datacontainer ubuntu
这造就了一个名为container datacontainer
基于该的ubuntu
形象和在目录/tmp
。
现在,如果我们运行带有一个新的Ubuntu的容器--volumes-from
标志并运行bash
再次正如我们前面所做的,任何我们写/tmp
目录将被保存到/tmp
我们的量datacontainer
容器。
首先,启动ubuntu
形象:
docker run -t -i --volumes-from datacontainer ubuntu /bin/bash
该-t
命令行选项从容器中调用终端。 该-i
标志使连接互动。
在为bash提示符ubuntu
容器,创建在一个文件中/tmp
:
echo "I'm not going anywhere" > /tmp/hi
来吧,键入exit
返回到您的主机的外壳。 现在,再次运行相同的命令:
docker run -t -i --volumes-from datacontainer ubuntu /bin/bash
这一次的hi
文件已经存在:
cat /tmp/hi
你应该看到:
Output of cat /tmp/hiI'm not going anywhere
您可以添加尽可能多的--volumes-from
标志,只要你愿意(例如,如果你想组装从多个数据容器使用数据的容器)。 您还可以根据需要创建任意多的数据卷容器。
唯一要注意这种方法是,你只能选择容器内的安装路径( /tmp
当您创建数据量的容器在我们的例子)。
在主机和Docker容器之间共享数据
Docker容器的另一个常见用途是作为在主机和Docker容器之间共享文件的一种手段。 这与上一个示例的工作不同。 没有必要先创建一个“仅数据”容器。 您可以简单地运行任何Docker镜像的容器,并使用主机系统上目录的内容覆盖其中一个目录。
作为一个快速的现实世界的例子,让我们说,你想使用官方的Docker Nginx镜像,但你想保留Nginx的日志文件的永久副本,以便以后分析。 默认情况下, nginx
Docker图像记录到/var/log/nginx
目录,但是这是/var/log/nginx
DockerNginx的容器内。 通常它不能从主机文件系统访问。
让我们创建一个文件夹来存储我们的日志,然后用一个共享卷运行Nginx的图像的副本,以便Nginx的将日志写入我们的主机的文件系统,而不是到/var/log/nginx
容器内:
mkdir ~/nginxlogs
然后启动容器:
docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx
该run
命令是到目前为止,我们所使用的那些有一点不同,所以让我们一块把它分解一块:
-v ~/nginxlogs:/var/log/nginx
-我们建立了链接的卷/var/log/nginx
从Nginx的容器内目录复制到~/nginxlogs
目录主机上。 Docker使用:
从容器路径拆分主机的路径,主机路径始终是第一位的。-d
-分离的过程,并在后台运行。 否则,我们只是看一个空的Nginx提示,并将无法使用这个终端,直到我们杀了Nginx。-p 5000:80
-设置一个端口转发。 Nginx容器默认侦听端口80,这将Nginx容器的端口80映射到主机系统上的端口5000。
如果你关注,你可能也注意到从以前的另外一个区别run
命令。 到现在为止,我们已经在我们所有的结尾被指定命令run
的语句(通常是/bin/bash
)来告诉Docker什么命令到容器内运行。 因为Nginx镜像是一个官方Docker镜像,它遵循Docker的最佳实践,镜像的创建者设置镜像来运行命令自动启动Nginx。 我们正好可以放下平时/bin/bash
位置,让影像的创造者选择什么样的命令,在为我们的容器中运行。
所以,我们现在有一个Nginx的副本在我们的机器上的Docker容器中运行,我们的主机端口5000直接映射到Nginx的端口80的副本。让我们使用curl做一个快速测试请求:
curl localhost:5000
你会得到一个从Nginx显示Nginx启动并运行一个筛选的HTML回来。 但更有趣的是,如果你在看~/nginxlogs
主机上的文件夹,并采取一看access.log
文件,你会看到从Nginx的展示了我们的请求日志消息:
cat ~/nginxlogs/access.log
你会看到类似的东西:
Output of `cat ~/nginxlogs/access.log`172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
如果你做任何更改~/nginxlogs
文件夹,你就可以看到他们从Docker容器内实时为好。
结论
这就总结了! 我们现在已经介绍了如何创建数据卷容器,它的卷可以用作在其他容器中保存数据的方式,以及如何在主机文件系统和Docker容器之间共享文件夹。 这涵盖了除了最先进的使用情况之外的所有Docker数据卷。
如果您正在使用Docker Compose,Docker的数据量可以在配置docker-compose.yml
文件。 看看如何安装和在Ubuntu 14.04使用Docker Compose的详细信息。
祝你好运和快乐Dockering!