在本文中,我们将介绍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 的--volumes-from
选项从此容器中获取卷并将其应用于当前容器。乍一看这有点不寻常,所以让我们来看一个快速的例子,说明即使容器被移除,我们也可以使用这种方法使byebye
文件保持不变。
首先,创建一个新的数据卷容器来存储我们的卷:
docker create -v /tmp --name datacontainer ubuntu
这创建了一个基于ubuntu
图像和在/tmp
目录中的命名为datacontainer
的容器。
现在,如果我们运行带有--volumes-from
标志的新Ubuntu容器并像之前那样再次运行bash
,我们写入/tmp
目录的任何内容都将保存到datacontainer
容器的/tmp
卷中。
首先,启动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
你应该看到:
I'm not going anywhere
您可以根据需要添加任意数量的--volumes-from
标志(例如,如果要组装使用来自多个数据容器的数据的容器)。您还可以根据需要创建任意数量的数据量容器。
此方法的唯一警告是,您只能在创建数据卷容器时选择容器内的装载路径(在我们的示例中是/tmp
)。
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
你会看到类似的东西:
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!
想要了解更多关于使用Docker数据卷的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Work with Docker Data Volumes on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。