如何在Ubuntu14.04上使用Docker数据卷

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

到本文结束时,您应该能够轻松创建和使用任何类型的 Docker 数据卷。

先决条件

要学习本教程,您将需要以下内容:

注意: 尽管先决条件给出了在 Ubuntu 14.04 上安装 Docker 的说明,但只要安装了 Docker,本文中用于 Docker 数据卷的 docker 命令应该可以在其他操作系统上运行。


解释 Docker 容器

使用 Docker 需要了解很多 Docker 特定的概念,并且大多数文档都集中在解释如何使用 Docker 的工具集,而没有过多解释为什么要使用这些工具。 如果您是 Docker 新手,这可能会让人感到困惑,因此我们将从了解一些基础知识开始,然后开始使用 Docker 容器。 如果您以前使用过 Docker,并且只想知道如何开始使用数据卷,请随意跳到下一部分。

Docker 容器类似于虚拟机。 它基本上允许您在容器内运行预打包的“Linux 盒子”。 Docker 容器和典型虚拟机之间的主要区别在于,Docker 不像普通虚拟机那样与周围环境完全隔离。 Docker 容器与主机操作系统共享 Linux 内核,这意味着它不需要像虚拟机那样“启动”。

由于共享了这么多,启动 Docker 容器是一种快速且廉价的操作——在大多数情况下,您可以在运行正常的同时启动一个完整的 Docker 容器(相当于普通虚拟机)命令行程序。 这很棒,因为它使部署复杂系统变得更加容易和更加模块化,但它与通常的虚拟机方法不同,并且对来自虚拟化世界的人们有一些意想不到的副作用。

学习 Docker 数据卷的类型

Docker 数据卷有三个主要用例:

  1. 在容器被移除时保留数据
  2. 在主机文件系统和 Docker 容器之间共享数据
  3. 与其他 Docker 容器共享数据

第三种情况更高级一些,所以我们不会在本教程中介绍它,但前两种很常见。

在第一种(也是最简单的)情况下,即使您移除容器,您也只是希望数据保留,因此让 Docker 管理数据的存储位置通常是最简单的。

保持数据持久性

无法在 Docker 中直接创建“数据卷”,因此我们创建了一个 数据卷容器,并附加了一个卷。 对于您想要连接到此数据卷容器的任何其他容器,请使用 Docker 的 --volumes-from 选项从该容器中获取卷并将它们应用于当前容器。 乍一看这有点不寻常,所以让我们通过一个快速示例来说明如何使用这种方法使我们的 byebye 文件即使在容器被删除的情况下仍然存在。

首先,创建一个新的数据卷容器来存储我们的卷:

docker create -v /tmp --name datacontainer ubuntu

这基于 ubuntu 图像和目录 /tmp 创建了一个名为 datacontainer 的容器。

现在,如果我们运行一个带有 --volumes-from 标志的新 Ubuntu 容器并像之前一样再次运行 bash,我们写入 /tmp 目录的任何内容都将保存到 [我们的 datacontainer 容器的 X172X] 体积。

首先,启动 ubuntu 图像:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

-t 命令行选项从容器内部调用终端。 -i 标志使连接交互。

ubuntu 容器的 bash 提示符下,在 /tmp 中创建一个文件:

echo "I'm not going anywhere" > /tmp/hi

继续并键入 exit 以返回主机的 shell。 现在,再次运行相同的命令:

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 目录,但这是 Docker Nginx 容器内的 /var/log/nginx。 通常它无法从主机文件系统访问。

让我们创建一个文件夹来存储我们的日志,然后使用共享卷运行 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 — 我们设置了一个卷,将 Nginx 容器内的 /var/log/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 放在这里,让镜像的创建者为我们选择在容器中运行的命令。

因此,我们现在在我们机器上的 Docker 容器中运行了 Nginx 的副本,并且我们的主机的端口 5000 直接映射到 Nginx 的端口 80 的副本。 让我们使用 curl 来做一个快速测试请求:

curl localhost:5000

你会从 Nginx 得到一屏 HTML,显示 Nginx 已经启动并运行。 但更有趣的是,如果您查看主机上的 ~/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-compose.yml 文件中配置 Docker 数据卷。 查看 如何在 Ubuntu 14.04 上安装和使用 Docker Compose 了解详细信息。

祝你好运,快乐 Dockering!