Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离。默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失。为了解决这个问题并在容器生命周期内保留数据,Docker 提供了各种数据持久化方法。

  • Docker 卷
  • 绑定挂载
  • Docker tmpfs 挂载

Docker 卷

Docker 卷是持久化 Docker 容器生成和使用的数据的首选方法。卷是主机机器上的目录,Docker 用它来存储文件和目录,可以超出容器生命周期。Docker 卷可以在容器之间共享,并提供各种好处,如易于备份和数据迁移。

要创建卷,请使用以下命令:

docker volume create volume_name

要使用卷,请在您的 docker run 命令中添加 --volume (或 -v)标志:

docker run --volume volume_name:/container/path image_name

绑定挂载

绑定挂载允许您将主机机器上的任何目录映射到容器内的目录。这种方法在开发环境中很有用,当您需要修改主机系统上的文件,并且这些更改应立即在容器中生效时。

要创建绑定挂载,请在您的 docker run 命令中使用 --mount 标志,并将 type=bind 添加到其中:

docker run --mount type=bind,src=/host/path,dst=/container/path image_name

Docker tmpfs 挂载

Docker tmpfs 挂载允许您在容器的内存中直接创建临时文件存储。在 tmpfs 挂载中存储的数据快速且安全,但一旦容器终止,数据将丢失。

要使用 tmpfs 挂载,请在您的 docker run 命令中添加 --tmpfs 标志:

docker run --tmpfs /container/path image_name

通过采用这些方法,您可以确保容器生命周期内的数据持久性,增强 Docker 容器的实用性和灵活性。请记住选择最适合您用例的方法,无论是首选 Docker 卷,方便的绑定挂载,还是快速且安全的 tmpfs 挂载。

临时文件系统

默认情况下,Docker 容器内的存储是短暂的,这意味着容器内部进行的任何数据更改或修改只会持续到容器运行的时间。一旦容器停止并移除,所有相关的数据都将丢失。这是因为 Docker 容器的本质是无状态的。

这种临时或短暂的存储称为“临时容器文件系统”。这是 Docker 的一个重要特性,因为它能够在不考虑容器状态的情况下,在不同的环境中快速、一致地部署应用程序。

临时文件系统与数据持久性

任何存储在容器的临时文件系统中的数据在容器停止或移除时都会丢失,这对应用程序的数据持久性构成了挑战。对于像数据库这样需要在多个容器生命周期中保持数据持久性的应用程序,这是特别有问题的。

为了克服这些挑战,Docker 提供了几种数据持久性的方法,例如:

  • :Docker 管理的存储选项,存储在容器的文件系统之外,允许数据在容器重新启动和删除时持久化。
  • 绑定挂载:将主机机器的目录或文件映射到容器中,有效地将主机的存储与容器共享。
  • tmpfs 挂载:内存中的存储,适用于仅需要在容器生命周期内持久化数据的情况。

通过实施这些策略,Docker 确保应用程序数据可以在单个容器的生命周期之外得以保留,使得可以处理有状态的应用程序。

卷挂载(Volume Mounts)

卷挂载是将主机系统上的文件夹或文件映射到容器内部的文件夹或文件的一种方式。这使得即使容器被删除,数据仍然可以在容器外部保持。此外,多个容器可以共享同一个卷,使得容器之间的数据共享变得容易。

创建卷(Creating a Volume)

要在Docker中创建一个卷,您需要运行以下命令:

docker volume create my-volume

此命令将创建名为my-volume的卷。您可以使用以下命令查看创建的卷的详细信息:

docker volume inspect my-volume

将卷挂载到容器(Mounting a Volume in a Container)

要将卷挂载到容器中,您需要在运行容器时使用-v--mount标志。以下是一个例子:

使用-v标志:

docker run -d -v my-volume:/data your-image

使用--mount标志:

docker run -d --mount source=my-volume,destination=/data your-image

在上面的两个示例中,my-volume是我们之前创建的卷的名称,/data是卷将被挂载到容器内的路径。

在多个容器之间共享卷(Sharing Volumes Between Containers)

要在多个容器之间共享卷,只需在多个容器上挂载相同的卷即可。以下是如何在运行不同映像的两个容器之间共享my-volume的示例:

docker run -d -v my-volume:/data1 image1docker run -d -v my-volume:/data2 image2

在此示例中,image1image2将可以访问存储在my-volume中的相同数据。

删除卷(Removing a Volume)

要删除卷,您可以使用docker volume rm命令后跟卷名称:

docker volume rm my-volume

这就是卷挂载在Docker中的基本知识。您可以使用它们高效且安全地在容器之间持久化和共享数据。

最后

为了方便其他设备和平台的小伙伴观看往期文章,链接奉上:

公众号 Let us Coding牛客知乎开源中国CSDN思否掘金InfoQ简书博客园慕课51CTOhelloworld腾讯开发者社区阿里开发者社区

看完如果觉得有帮助,欢迎点赞、收藏关注

Docker学习路线5:在 Docker 中实现数据持久化的更多相关文章

  1. 优秀的云计算工程师需要学什么?云计算Docker学习路线

    云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...

  2. docker 学习路线

    docker 学习路线 参考资料 知乎 docker 的学习路线 Docker - 从入门到实践 Docker 核心技术与实现原理 Docker 入门 <Kubernetes in Action ...

  3. Docker学习(三)docker容器操作

    上一篇:Docker学习(二)docker镜像操作 容器是基于镜像创建的,说白了把一个镜像运行起来就是容器 查看容器 docker ps 上面什么也没有,因为我们没有正在运行的容器,下面我门启动一个容 ...

  4. Docker学习(十)Docker容器编排 Docker-compose

    Docker学习(十)Docker容器编排 Docker-compose 标签(空格分隔): docker 容器编排是什么 应用一般由单独容器化的组件组成,须按照一定顺序在网络级别进行组织,以使其能够 ...

  5. [转]Docker学习之四:使用docker安装mysql

    本文转自:https://blog.csdn.net/qq_19348391/article/details/82998391 Docker学习之一:注册Docker Hub账号 Docker学习之二 ...

  6. Docker学习(二)docker镜像操作

    上一篇:docker学习(一)在centos7上安装docker 列出所有docker镜像 docker images 拉取镜像 docker pull 镜像名 我这里一Tomact为例 首先在Doc ...

  7. Docker学习(十一)Docker系列结束-新的开始K8S

    Docker学习(十一)Docker系列结束-新的开始K8S 标签(空格分隔): docke k8s Docker系列结束 上一篇讲到使用docker官方提供的容器编排工具docker-compose ...

  8. docker学习笔记-04:docker容器数据卷

    一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...

  9. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  10. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

随机推荐

  1. ubuntu 中 docker 每次都输入 sudo 命令

    查看用户组及成员 sudo cat /etc/group | grep docker 可以添加docker组 sudo groupadd docker 添加用户到docker组 sudo gpassw ...

  2. Google Test Adapter安装

    背景 我有一个vs2015 的gtest 工程,编译完成后,需要gtest adapter帮我把测试列表显示出来,但是通过vs自带的工具或者网页下载安装遇到2个问题: 1.下载速度超级慢,慢到我能到火 ...

  3. Java是解释型语言么

    基础概念 JVM虚拟机会将.java类文件编译成.class文件--字节码文件,这大家都知道. 代码运行时还需要将.class字节码文件翻译成机器码才能执行. 解释执行:将编译好的字节码一行一行地翻译 ...

  4. Langchain 介绍与入门

    官方介绍 LangChain 是一个利用LLM开发应用程序的框架.它让应用程序具备: 上下文感知能力:将LLM连接到上下文源(提示说明.少量示例.用以形成其响应的内容等) 推理:依靠LLM进行推理(例 ...

  5. rt_snprintf()是什么

    在c++中snprintf()函数的解释 1,函数原型: int snprintf(char* dest_str,size_t size,const char* format,...); 2,功能 将 ...

  6. 用Pandoc生成TXT格式的目录

    我一直使用Markdown格式写作,使用Pandoc生成PDF和Word格式的文档.Pandoc能生成很好的章节和目录,但有时候,也需要生成TXT格式的目录,今天就尝试了一下. 由于我写的内容章节比较 ...

  7. Netty笔记(4) - 对Http和WebSocket的支持、心跳检测机制

    对HTTP的支持 服务端代码: 向 PipeLine中 注册 HttpServerCodec Http协议的编码解码一体的Handler 处理Http请求 封装Http响应 public class ...

  8. nginx判断是否手机访问

    if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle|MicroMessenger |iPad)" ) ...

  9. 14 CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)C. Tenzing and Balls(dp+前缀最大值优化)

    思路: dp还是挺明显的,思路可以参考最长上升子序列 有点dp的感觉 \(f[i]\)表示考虑前\(i\)个数,的最大值 当前数有两种删或不删 不删:\(f[i]=f[i-1]\); 删:\(f[i] ...

  10. 【思维题、KMP】P3526 [POI2011]OKR-Periodicity 题解

    P3526 [POI2011]OKR-Periodicity 题解 前言 一道非常厉害的思维题.看题解得到了一些提示搞出来了. 作为 2011 年的题还是很厉害的. 约定 定义 \(s[l,r]\) ...