如何与Docker的数据量工作在Ubuntu 14.04

介绍

在本文中,我们将介绍Docker数据卷的概念:它们是什么,为什么它们有用,不同类型的卷,如何使用它们以及何时使用它们。 我们还将经历如何通过使用Docker卷的一些例子docker命令行工具。

当我们到达文章的结尾,你应该很容易创建和使用任何类型的Docker数据卷。

先决条件

要遵循本教程,您需要以下内容:

注意:即使先决条件给出了在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数据卷有三个主要用例:

  1. 保持数据,即使通过容器重新启动
  2. 在主机文件系统和Docker容器之间共享数据
  3. 与其他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的日志文件的永久副本,以便以后分析。 默认情况下, nginxDocker图像记录到/var/log/nginx目录,但是这是/var/log/nginxDockerNginx的容器内。 通常它不能从主机文件系统访问。

让我们创建一个文件夹来存储我们的日志,然后用一个共享卷运行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!

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏