Docker容器的持久存储模式

本文介绍了Docker容器的六种持久存储模式,包括默认模式、数据卷模式等,并详细阐述了容器持久性和主机持久性的含义及实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宽为限 紧用功 功夫到 滞塞通

【编者的话】本文讨论了Docker容器的持久存储模式,包括默认模式、数据卷模式、只含数据的容器、从主机映射而得的数据卷、从主机映射而得的数据卷且存储后端是共享存储以及 Convoy 存储插件,其中第 2-4 种支持容器持久性,即升级容器也不会移除数据;第 5-6 种支持主机持久性,即主机失效也不会引起数据丢失。

简介

说到Docker,持久存储是一个需要小心处理的问题。通常一个服务的升级流程是关停旧版本容器,然后拉取并启动新版本容器。默认情况下,旧版容器包含的所有数据都会被消除,我们当然不想这样。

这里写图片描述

本文将讨论保证数据持久性的几种模式:

  • 默认模式:不支持任何持久性
  • 数据卷:容器持久性
  • 仅含数据的容器:容器持久性
  • 从主机映射而得的卷:容器持久性
  • 从主机映射而得的卷,存储后端是共享存储:主机持久性
  • Convoy 卷插件:主机持久性

上述几种持久性(我自己发明的)是什么意思呢?

  • 容器持久性:升级容器并不会移除数据
  • 主机持久性:主机失效也不会引起数据丢失

下面一一解释这些持久存储模式。

默认模式

这是最基本的一种持久存储模式。创建容器时没有指定任何与卷相关的选项,数据保存在容器内部。前文已经提及,升级容器会导致容器数据丢失。如果容器是无状态的,这当然没问题;如果容器是有状态的,需要持久保存数据(例如,数据库容器),默认模式显然就不适合了。

这里写图片描述

数据卷

在创建容器时指定 volume 选项。数据卷位于主机系统的特定位置下(例如, /var/lib/docker/volumes/_container_name_/_data 目录下,可用 docker inspect 命令查看),升级容器时不会改动这些数据。

这里写图片描述

只包含数据的容器

只包含数据的容器与典型的数据卷相比略有不同。首先创建一个数据卷容器(通常以 busybox 或 alpine 为基础镜像),然后在启动主容器时使用 -volumes-from 选项,把数据卷容器的所有卷映射到主容器内。这是一种典型的随从模式实现。

这里写图片描述

从主机映射而得的数据卷

这种模式是把主机的目录映射为容器的数据卷。在数据卷模式中,容器的文件夹实际上保存在主机 /var/lib/docker/volumes/ 目录下面的一个文件。而从主机映射的卷是直接建立容器与主机之间的目录映射。这种方式与数据卷模式具有相同的优点,也可以混合使用这两种模式。这种模式的主要缺点是容器与主机之间的权限(uid/gid)映射。

这里写图片描述

从主机映射而得的数据卷,存储后端是共享存储

把共享存储(例如, NFS, Gluster …)的文件夹映射为主机的文件夹,再映射为容器的卷。这种模式的主要优点是:即使主机失效,容器的数据也不会丢失。

这里写图片描述

Convoy 卷插件

主机级别的持久存储映射感觉还是有些“静态”——你必须保证所有主机默认具有相同的文件夹结构,否则终有一天会遇上麻烦。

Convoy 是 docker 的一个存储卷插件,起一个中介容器的作用:确保容器的数据卷链接到共享存储,目前实现了 NFS 和 Gluster 两种共享存储的支持,其他共享存储的支持据说“即将”实现。

这里写图片描述

其他模式

还有很多其他的持久存储模式。如果你有独特的持久存储模式,告诉我一声!

Flocker

我知道 Flocker ,虽然没试用过,看起来挺不错的。

这里写图片描述

结论

  • Docker 支持数据持久性!
  • 记住有多种持久存储模式,每一种各有利弊。
  • 专业诀窍:一定要测试你选择的持久模式!与自我修复(resilience)和性能相关的方方面面都要进行复核。

原文链接:Docker : Storage Patterns for Persistence (翻译:柳泉波)

站在巨人的肩膀上

本文转载的网络地址
http://dockone.io/article/1283

### 实现Docker容器中的用户添加确保数据持久化的方案 要在 Docker 容器中使用 `useradd` 命令确保数据持久化,可以采用以下方法: #### 方法一:利用数据卷(Data Volume) 通过挂载宿主机目录到容器内部的方式,可以让用户的配置文件存储在宿主机上,从而实现数据的持久化。 1. **创建一个用于存储用户数据的目录** 在宿主机上创建一个专门用来存储 `/etc/passwd` 和其他相关文件的目录。例如: ```bash mkdir -p /host/userdata/etc ``` 2. **启动容器时挂载宿主机目录** 使用 `-v` 参数将宿主机上的目录挂载到容器内的对应路径。以下是具体命令: ```bash docker run -itd \ --name my_container \ -v /host/userdata/etc:/etc \ ubuntu:latest /bin/bash ``` 这样会把宿主机的 `/host/userdata/etc` 目录挂载到容器的 `/etc` 路径下[^1]。 3. **在容器内执行 `useradd` 命令** 登入容器后,可以通过 `exec` 或者直接进入容器来操作: ```bash docker exec -it my_container bash useradd testuser echo "testpassword" | passwd --stdin testuser exit ``` 4. **验证数据持久化效果** 删除容器后再重新拉起一个新的容器实例,仍然可以看到之前创建的用户信息被保留下来,因为这些数据已经写入到了宿主机的数据卷中。 #### 方法二:使用数据卷容器(Data Volume Container) 如果不想手动指定具体的宿主机路径,则可以选择定义专用的数据卷容器作为中介层来进行管理。 1. **先建立单独的数据卷容器** 此类容器仅负责提供共享空间而不运行任何实际进程。 ```bash docker create -v /etc --name etc_volume alpine:edge true ``` 2. **正常构建工作负载型应用容器的同时引入上述数据源支持** 当前要部署的应用程序容器需声明依赖于先前准备好的数据载体资源。 ```bash docker run -itd \ --name app_with_etc \ --volumes-from=etc_volume \ ubuntu:latest /bin/bash ``` 3. **后续维护同理参照前面描述** #### 示例代码展示 下面给出一段完整的脚本示例,演示如何自动化完成整个流程: ```bash #!/bin/sh HOST_DATA_DIR="/host/userdata" CONTAINER_NAME="my_custom_user_container" mkdir -p ${HOST_DATA_DIR}/etc docker rm -f "${CONTAINER_NAME}" || : docker run -dit \ --name="${CONTAINER_NAME}" \ -v "${HOST_DATA_DIR}"/etc:/etc \ ubuntu:latest sleep infinity docker exec -u root "${CONTAINER_NAME}" sh -c 'useradd demo && echo "demo:demopass" | chpasswd' ``` 以上脚本实现了自动删除旧容器、新建带持久化功能的新容器以及向其中加入测试账户的功能。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值