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. 【LeetCode双指针】合并两个有序数组,从后向前遍历

    合并两个有序数组 https://leetcode.cn/problems/merge-sorted-array/ 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m ...

  2. 【Azure 事件中心】Flink消费Event Hub中事件, 使用Azure默认示例代码,始终获取新产生的事件,如何消费旧事件呢?

    问题描述 根据Azure Event Hub示例文档,[将 Apache Flink 与适用于 Apache Kafka 的 Azure 事件中心配合使用],配置好 consumer.config 文 ...

  3. Java 练习题 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 * 增加4岁。如果5岁的狗、相当于人的多少年龄 * 10.5 + 10.5 + 4 +4 +4=33岁

    1 /*** 2 * 练习题 3 * 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 4 * 增加4岁.如果5岁的狗.相当于人的多少年龄 5 * 10.5 + 10.5 + 4 ...

  4. Dungeon Master 题解

    这道题的题意简单来说:就是在3D迷宫里找出口,也就是三维地图,需要用到三维数组 由于本人写代码极易出错,所以在输入三维数组的时候修改了c(column,即列)的值,重复定义了没看到==,后面改成定义成 ...

  5. 手机端User-agent

    转载: http://www.fynas.com/ua 设备 系统 浏览器 User-Agent vivo X20Plus A Android 手机百度 Mozilla/5.0 (Linux; And ...

  6. 手撕fft算法--fft原理和源码解析

    一 前言   在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊.   二 问题   这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...

  7. Kotlin学习快速入门(9)—— 密封类的使用

    原文地址: Kotlin学习快速入门(9)-- 密封类的使用 - Stars-One的杂货小窝 代码逻辑中,很多时候我们会需要分支语句,来根据数据的情况走不同的处理逻辑,而密封类就是在这种情况下,方便 ...

  8. Spring Boot学习日记7

    学会了配置spring boot 导入各种组件 SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值 将这些自动配置的类导入容器,自动配置类就会 ...

  9. 还在用Calendar操作Date?Java8都弃用了,还不知道它的这款强大的工具吗?

    引言 在过去的Java版本中,日期和时间的处理主要依赖于java.util.Date和java.util.Calendar类,然而随着业务系统的复杂以及技术层面的提升,这些传统的日期时间类暴露出了若干 ...

  10. python高级技术(网络编程二)

    一 粘包现象(基于TCP协议实现远程执行命令) 1.TCP协议,会出现粘包现象 例:ipconfig命令,客户端收到的字符串比较短,客户端能够收完整, tasklist命令,客户端收到的字符串超过10 ...