提升Docker效率的小操作——用volume实现容器和主机之间共享数据 [转载]

简介: 对于Docker来说,创建一个容器实际上非常简单:您只需要拉取一个镜像,并将其部署成容器就可以了。但是这个容器该如何保存数据呢?换言之,您要如何处理这些数据呢?又或者说,您要如何在容器之间共享这些数据呢?

说在前面

Docker是一个非常强大的工具,它帮助企业扩大产品规模,并简化部署容器化应用程序的流程。对于Docker来说,创建一个容器实际上非常简单:您只需要拉取一个镜像,并将其部署成容器就可以了。但是这个容器该如何保存数据呢?换言之,您要如何处理这些数据呢?又或者说,您要如何在容器之间共享这些数据呢?

Docker 容器的机制是由一系列只读层构成,其最上层包含一个最终的读写层。这是一个非常复杂的系统——称为联合文件系统(UFS)

当您不需要保留数据时,该文件系统可以很好的完成该任务。但是,当您需要停止、重新部署一个容器并需要保留数据时,那该怎么办呢? 为了能够保存数据(或者在容器之间共享数据),您必须用到volumes 。Docker volume 是存在于主机文件系统上(在联合文件系统之外)的目录(或文件)。

您该如何创建和管理这些volumes ?接下来,跟着我找出答案吧!我将在Ubuntu Server 16.04平台上使用Docker的最新版本。不管您使用的是什么主机操作系统,使用volumes的流程都是相同的。

创建一个标准的volume

让我们创建一个名为“volume1”的volume 。这是通过如下命令完成的:

docker volume create --name volume1

如果我们输入“docker volume ls”的命令,那么我们刚刚创建的“volume1”将出现在图1的列表中。

(图1)我们刚刚创建的“volume1”准备就绪

您可以通过输入“docker volume inspect volume1”的命令来获取更多关于“volume1”的详细信息。该命令的输出结果(图2)将显示“volume1”的名称、选项、挂载点等相关信息。

(图2)关于“volume1”的细节

然而,并不是所有标准的volume都是有用的。接下来,让我们创建一个可以让Docker 容器变得更加灵活的volume吧。

创建一个主机数据volume

现在,我们要做的就是部署一个新的容器(基于最新的Ubuntu镜像),这个容器包含一个附着在主机目录上的volume。这意味着您可以在该容器内工作并将数据保存到容器目录中,同时这些容器目录中的数据将与主机目录同步。您必须做的第一件事就是确保创建了主机目录。我们将使用如下命令来创建一个名为“container-data”的目录:

mkdir ~/container-data

确保在Docker用户可以访问的位置来创建上述目录。实际上,您可以在系统的任何位置创建该目录(只要用户具有读写权限)。使用该目录,部署容器的命令(将主机目录附着到容器volume,它位于容器内的/ data目录下)将是:

docker run -d -P --name test-container -v /home/jack/container-data:/data ubuntu

现在,您应该可以看到容器ID了,记下前四个字符,我们来测试一下。在shell界面,对正在运行的容器使用如下命令:

docker attach ID(其中ID是运行容器的前四个字符)

其中ID是运行容器的前四个字符。

现在,您的光标应该出现在bash提示符处。如果您输入“ls /”的命令,您应该能看到那个我们在容器运行时添加的数据目录。接下来,我们创建一个带有“touch / data / test”命令的测试文件。然后,回到主机的终端,并输入“ls ~/ container-data”的命令。您应该可以看到列出的测试文件。现在,再从同一终端输入“touch ~/ container-data / test2”的命令。最后,返回到我们的容器shell界面并输入“ls / data”命令,这时应该会同时出现test和test2两个文件。这时,您运行的容器正在共享主机文件上的数据。

您可以根据需要将尽可能多的容器附加到该主机目录上,每个容器(以及主机)都可以访问相同的数据。正如Larry David 所说:“这真的是非常、非常、非常的方便”。

让Docker变得更加有用

利用Volumes是一个使Docker容器变得更加有用的好方法。Volumes 可以帮助您备份数据,在容器之间共享数据,甚至可以在容器和主机之间共享数据。

目录
相关文章
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
321 2
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
290 1
|
存储 消息中间件 容器
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
234 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
存储 数据管理 Linux
docker中使用主机路径作为数据卷
【10月更文挑战第13天】
280 2
|
安全 Linux 调度
docker的底层原理三: 内核共享
本文阐述了Docker容器通过共享宿主机的内核来实现轻量级运行,同时利用命名空间、控制组、文件系统和网络隔离等技术确保容器的安全性和资源控制。
801 6
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
4519 0
|
存储 安全 Docker
docker中数据卷的共享与复制
【10月更文挑战第8天】
642 1
|
安全 Ubuntu 网络安全
docker中主机模式(host)
【10月更文挑战第4天】
1355 1
|
存储 索引 Python
python中的数据容器
python中的数据容器