如何在 Ubuntu 14.04 上使用 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 数据量有三个主要用例:

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

第三个案例有点先进,所以我们不会在本教程中探讨它,但前两个是相当常见的。

在第一个(最简单的)情况下,即使你删除容器,你也只想让数据挂起来,所以通常是最容易让Docker管理数据存储的地方。

数据保持持久性

在Docker中没有直接创建数据量的方法,所以我们会创建一个 data volume container 与它附带的量。对于任何其他容器,您随后想要连接到这个数据量容器,请使用Docker的--volumes-from选项从这个容器中获取量,并将其应用到当前容器中。

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

1docker create -v /tmp --name datacontainer ubuntu

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

现在,如果我们运行一个新的Ubuntu容器,标记为--volumes-from,然后像以前一样再次运行bash,我们在/tmp目录中写的任何东西都将被保存到我们的datacontainer容器的/tmp容量。

首先,开始ubuntu图像:

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

t命令行选项从容器内部调用一个终端。

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

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

继续,输入退出,返回主机壳. 现在,再次运行相同的命令:

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

此时此刻的Hi文件已经在那里:

1cat /tmp/hi

你应该看到:

1[secondary_label Output of cat /tmp/hi]
2I'm not going anywhere

您可以添加您想要的数量(例如,如果您想要组装一个使用多个数据容器的数据容器的容器),也可以创建您想要的数量的数据容器。

这种方法的唯一警告是,当您创建数据量容器时,您只能选择容器内部的安装路径(在我们的示例中,`/tmp)。

主机和 Docker 容器之间的数据共享

Docker 容器的另一个常见用途是通过在主机和 Docker 容器之间共享文件的方式。这与上一个例子不同。首先不需要创建一个仅限数据的容器。

作为一个快速的现实世界的例子,假设您想要使用官方的Docker Nginx图像,但您想要保留永久副本的Nginx日志文件,以便稍后进行分析。 默认情况下,nginxDocker图像日志到/var/log/nginx目录,但这是/var/log/nginx在Docker Nginx容器内。

让我们创建一个文件夹来存储我们的日志,然后运行一个共享卷的 Nginx 图像副本,以便 Nginx 将其日志写入我们的主机的文件系统,而不是在容器内的 `/var/log/nginx:

1mkdir ~/nginxlogs

然后开始容器:

1docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx

这个运行命令与我们迄今为止使用的命令有所不同,所以让我们把它分成部分:

  • -v ~/nginxlogs:/var/log/nginx — 我们设置了一个卷,将从 Nginx 容器内部的 /var/log/nginx 目录连接到主机上的 ~/nginxlogs 目录。 Docker 使用一个 : 将主机的路径从容器路径分开,主机路径总是先到
  • d — 切断进程并在背景中运行。否则,我们只会观看一个空的 Nginx 提示,并且无法使用这个终端,直到我们杀死 Nginx。

如果你仔细注意,你可能也注意到另一个不同于以前的运行命令的差异。到目前为止,我们一直在指定一个命令在我们所有的运行陈述(通常是/bin/bash)的末尾,告诉Docker在容器内运行哪个命令。因为 Nginx 图像是官方的Docker图像,它遵循Docker的最佳做法,而图像的创造者设置了图像以自动启动 Nginx的命令。我们可以在这里放下通常的/bin/bash,并让图像的创造者选择在容器中运行哪个命令。

因此,我们现在有一个 Nginx 副本在我们机器上的 Docker 容器中运行,我们的主机的端口 5000 地图直接到 Nginx 端口的那个副本 80。

1curl localhost:5000

更有趣的是,如果你在主机上的~/nginxlogs文件夹中查看并查看access.log文件,你会看到来自 Nginx的日志信息显示我们的请求:

1cat ~/nginxlogs/access.log

你会看到类似的东西:

1[secondary_label Output of `cat ~/nginxlogs/access.log`]
2172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

如果你对~/nginxlogs文件夹进行任何更改,你也可以从Docker容器内部实时查看它们。

结论

我们现在已经涵盖了如何创建数据量容器,其容量我们可以使用作为在其他容器中保持数据的方式,以及如何在主机文件系统和Docker容器之间共享文件夹。

如果您正在使用 Docker Compose,则可以在您的docker-compose.yml文件中配置 Docker 数据卷,请参阅 如何在 Ubuntu 14.04 上安装和使用 Docker Compose以获取详细信息。

幸运和快乐的Dockering!

Published At
Categories with 技术
Tagged with
comments powered by Disqus