介绍
在本文中,我们将探讨Docker数据卷的概念:它们是什么,它们为什么有用,不同类型的卷,如何使用它们,以及何时使用它们。
在我们到达文章结束时,您应该舒适地创建和使用任何类型的Docker数据量。
前提条件
要遵循本教程,您将需要以下内容:
- Ubuntu 14.04 Droplet
- 具有 sudo 特权的非根用户(Initial Server Setup with Ubuntu 14.04解释如何设置此设置)。
<$>[注]
**注:**虽然先决条件指示在Ubuntu 14.04上安装Docker,但本文中的Docker数据卷的docker
命令应该在安装Docker的其他操作系统上工作。
解析 Docker 容器
使用 Docker 需要了解一些 Docker 特定的概念,而大部分的文档都集中在解释如何使用 Docker 工具集,而无需解释为什么您想要使用这些工具。如果您是 Docker 的新手,这可能令人困惑,所以我们将开始通过一些基本知识,然后跳入使用 Docker 容器的工作。
Docker 容器与虚拟机类似,它基本上允许您在容器内运行预包装的Linux 箱
。 Docker 容器和典型的虚拟机之间的主要区别在于 Docker 并不像正常虚拟机那样与周围环境隔绝。 Docker 容器与主机操作系统共享 Linux 内核,这意味着不需要像虚拟机那样启动
。
由于如此多的共享,开启 Docker 容器是一个快速和廉价的操作 - 在大多数情况下,你可以带来一个完整的 Docker 容器(相当于正常的虚拟机)在运行正常命令行程序的同时。
学习 Docker 数据量类型
Docker 数据量有三个主要用例:
- 在删除容器时保持数据 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日志文件,以便稍后进行分析。 默认情况下,nginx
Docker图像日志到/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!