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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 对于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 可以帮助您备份数据,在容器之间共享数据,甚至可以在容器和主机之间共享数据。

目录
相关文章
|
14天前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
15天前
|
Oracle 关系型数据库 数据库
|
3天前
|
监控 数据可视化 虚拟化
Docker容器常用命令笔记分享
Docker容器常用命令笔记分享
33 2
|
9天前
|
存储 Kubernetes 搜索推荐
作为k8s容器运行时,containerd跟docker的对比
作为k8s容器运行时,containerd跟docker的对比
111 0
作为k8s容器运行时,containerd跟docker的对比
|
10天前
|
消息中间件 Linux 开发工具
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
|
10天前
|
JavaScript Shell Docker
|
14天前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
15天前
|
应用服务中间件 Docker 容器
在Docker容器和主机之间复制文件/文件夹
在Docker容器和主机之间复制文件/文件夹
23 0
|
15天前
|
Ubuntu Shell 开发者
Docker容器管理
Docker容器管理
18 0
|
网络协议 Java Maven
docker将数据从宿主机挂载到容器的方式(二)
docker将数据从宿主机挂载到容器的方式(二)
421 0
docker将数据从宿主机挂载到容器的方式(二)

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版