Docker 数据持久化方案详解

这篇具有很好参考价值的文章主要介绍了Docker 数据持久化方案详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker 数据持久化方案详解

目录

一、Docker数据持久化概述

1.1联合文件系统

1.2容器的数据卷

1.2.1 什么是数据卷

1.2.2 数据卷特点

1.2.3 Docker提供三种方式将数据从宿主机挂载到容器

二、 Docker持久化方案

2.1 查看volume 基本命令使用方法

2.2 volume持久化方案

2.2.1volume简介

2.2.2.volume特点

2.2.3 挂载指定volume

2.2.4 volume使用场景

2.3 Bind Mounts持久化方案

2.3.1 bind mount特点

2.3.2 bind mount使用场景

2.3.3 常用命令

2.3.4 bind mount注意事项

2.4 tmpfs mount持久化方案

2.4.1 tmpfs mount

2.4.2 tmpfs mount特点

2.4.3 tmpfs mount使用场景


一、Docker数据持久化概述


1.1联合文件系统


了解联合文件系统后,我们知道,镜像是只读的,类似共享文件形式让多个容器使用。如果要在容器里修改文件,即镜像里的文件,那该如何修改?

为了解决这个问题,docker 引入了 写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改。

Docker 数据持久化方案详解

默认情况下,Docker容器内部新创建文件或者修改文件,结果会保存在容器的可读写层中,因此:

(1)当container消失时,与container一体的可读写层也一并消失,数据并未持久化。当一个container需要其它container中可读写层的数据时,读取操作非常困难。

(2)container可读写层与宿主机的文件系统紧密结合,很难进行迁移。

(3)写入数据到container可读写层需要storage driver,与直接在宿主机文件系统中读写数据相比效率要低。

1.2容器的数据卷


1.2.1 什么是数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。

1.2.2 数据卷特点

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间共享和重用
  • 可以对数据卷里的内容直接进行修改
  • 数据卷的变化不会影像镜像的更新
  • 卷会一直存在,即使挂载数据卷的容器已经被删除

1.2.3 Docker提供三种方式将数据从宿主机挂载到容器

  • Volumes: Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
  • Bind mounts: 将宿主机的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmps,同时避免写入容器可写层提高性能。

Docker 数据持久化方案详解


二、 Docker持久化方案


2.1 查看volume 基本命令使用方法

Docker 数据持久化方案详解

2.2 volume持久化方案


2.2.1volume简介

volume是Docker官方推荐的持久化方案,默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统外的程序无权限修改其中的数据。

一个volume可以同时供多个container使用,如果没有container使用volume,其不会自动删除,用户需运行docker volume prune明确删除。

如果用户显式创建volume,则需要给其指定一个名称;如果是隐式创建volume,Docker会自动为其分配一个在宿主机范围内唯一的名字。

2.2.2.volume特点

docker volume create -v 创建 volume 时,宿主机目录路径必须以/或~/开头,否则 Docker 会将其当成volume 而不是bind mount。

如果容器中的目录不存在,docker会自动创建目录;如果容器中的目录已有内容,docker会使用宿主机上目录的内容覆盖容器目录的内容。

2.2.3 挂载指定volume

### 管理卷
docker volume create nginx-vol # docker volume ls
docker volume inspect nginx-vol
## 用卷创建一个容器
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
## 清理
docker stop nginx-test # docker rm nginx-test
docker volume rm nginx-vol

## 注意:如果没有指定卷,自动创建。

创建数据卷,启动容器使用 nginx-vol 这个数据卷

[root@offline-client docker]# docker volume create nginx-vol
nginx-vol
[root@offline-client docker]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2022-05-15T12:10:52+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]
[root@offline-client ~]#  docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx:1.17Unable to find image 'nginx:1.17' locally
[root@offline-client ~]# curl  172.17.0.2
hello world

创建容器并挂载数据卷

Docker 数据持久化方案详解

2.2.4 volume使用场景

通过使用第三方提供的volume driver,用户可以将数据持久到远程主机或者云存储中。

(1)多个容器间共享数据。

(2)宿主机不保证存在固定目录结构。

(3)持久化数据到远程主机或者云存储而非本地。

(4)需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等

2.3 Bind Mounts持久化方案


bind mount持久化方式将宿主机中的文件、目录挂载到容器上,相应文件、目录可以被宿主机读写,也可以被容器读写。

bind mount持久化方式可以将数据存储在宿主机器任何地方,但会依赖宿主机的目录结构,因此不能通过docker CLI直接管理,并且非Docker进程和Docker进程都可以修改。

2.3.1 bind mount特点

(1)性能最好

(2)Docker容器与宿主机耦合过于紧密,移植性较差。

2.3.2 bind mount使用场景

(1)container共享宿主机配置文件,如docker将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。

(2)开发环境中build容器化。开发过程中将build过程container化,将宿主机上源代码目录bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结果写入另一个bind mount的目录中。

(3)监控服务container化。读取宿主机固定文件中的数据实现监控。

2.3.3 常用命令

#用卷创建一个容器:
docker run -d --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx 
docker run -d --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
# 验证绑定:
docker inspect nginx-test
# 清理:
docker stop nginx-test 
docker rm nginx-test

启动 nginx-test容器,挂载/app/wwwroot到/usr/share/nginx/html

[root@offline-client ~]# docker run -d --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
13e5652a1b889d61021b9b726579646a00531fa2773068b1b7066ff60eff11f5
[root@offline-client ~]# 
[root@offline-client ~]# 
[root@offline-client ~]# 
[root@offline-client ~]# ll  /app/wwwroot/
total 0
[root@offline-client ~]# echo hello world >  /app/wwwroot/index.html
[root@offline-client ~]# curl  172.17.0.2
hello world

将 根路径下wwwNginx路径mount到/usr/share/nginx/html,并输入 内容 ,然后访问

Docker 数据持久化方案详解

2.3.4 bind mount注意事项

(1)-v 宿主机目录路径必须以/或~/开头,否则docker会将其当成是volume 而不是bind mount。

(2)如果宿主机上的目录不存在,docker会自动创建目录(多级的绝对路径好像不行)。

(3)如果容器中的目录不存在,docker会自动创建目录。

(4)如果容器中目录已有内容,那么docker会使用宿主机上目录的内容覆盖容器目录的内容。

2.4 tmpfs mount持久化方案


2.4.1 tmpfs mount

tmpfs mount只在Linux主机内存中持久化,是临时性的。当容器停止,tmpfs mount会被移除,通常用于临时存放敏感文件。

tmpfs mounts 可选选项

Option

Description

tmpfs-size

挂载的tmpfs的字节数,默认不受限制

tmpfs-mode

tmpfs的文件模式,例如700或1700.默认值为1777,这意味着任何用户都有写入权限

使用--tmpfs参数无法指定任何其他的可选项,并且不能用于Swarm Service(集群节点服务)。

docker run -d -it --name tmptest --tmpfs /test busybox
Docker 数据持久化方案详解

2.4.2 tmpfs mount特点

(1)只能在Linux主机内存中,不会持久化到磁盘。

(2)不支持多容器间共享。

2.4.3 tmpfs mount使用场景

Docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要访问这些敏感数据的container或者service时,docker会在宿主机上创建一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据安全。当容器停止运行时,则相应的tmpfs也从系统中删除。


参考原文链接:Hello Docker(七)——Docker数据持久化_docker持久化目录_天山老妖的博客-CSDN博客

原文链接:Docker数据持久化_丰恒谷的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-471611.html

到了这里,关于Docker 数据持久化方案详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker (五)-docker存储-数据持久化

    将数据存储在容器中,一旦容器被删除,数据也会被删除。同时也会使容器变得越来越大,不方便恢复和迁移。 将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容器里,就可以快速的恢复。 volume 卷 卷存储在

    2024年02月20日
    浏览(50)
  • Docker啥是数据持久化?

    ​ 在容器层的 UnionFS(联合文件系统)中对文件/目录的任何修改,无论是手工修改还是容器在运行过程中的修改,在该容器丢失或被删除后这些修改将全部丢失。即这些修改是无法保存下来的。若要保存下来这些修改,通常有两种方式: 定制镜像持久化:将这个修改过的容

    2024年02月15日
    浏览(42)
  • docker安装redis并持久化数据

    这里是没有任何的密码 密码是刚才设置的Maqiang

    2024年02月11日
    浏览(46)
  • 【Docker】Docker 部署 Mysql 并设置数据持久化

    我们使用Docker的目的就是图它方便下载部署,不用常规的经历下载、配置、安装等等繁琐的步骤。但是与此同时Docker也存在一些缺点,像删除容器后数据就都没有了。很显然,不能持久化对于需要数据持久化的MySQL数据库来说是不能接受的,那有没有方式可以解决。 有,通过

    2024年02月10日
    浏览(34)
  • Docker Swarm NFS 数据持久化存储

    可参考我前面的博客《基于 Linux 的 Docker Swarm 集群部署及应用》 本次实验: master :192.168.56.142 work1 :192.168.56.132 work2 :192.168.56.180 可参考我前面的博客《构建NFS-FTP文件共享存储》 本次实验: NFS IP :192.168.56.141 Shared Dir :/data/sharedir 3.1 通过 Volume 3.1.1 创建 Volume 1、创建 Do

    2024年02月04日
    浏览(44)
  • Docker学习路线5:在 Docker 中实现数据持久化

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

    2024年02月16日
    浏览(45)
  • 【云原生】第八篇--Docker容器数据持久化存储机制

    物理机或虚拟机数据持久化存储 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接

    2023年04月09日
    浏览(44)
  • docker (六)-进阶篇-数据持久化最佳实践MySQL部署

    容器的数据挂载通常指的是将宿主机(虚拟机或物理机)上的目录或文件挂载到容器内部 详情参考docker官网文档 查询官网,MySQL必须要设置超级用户密码的环境变量 说明:上面的 -v 用于将项目数据目录、日志目录、配置文件目录映射到宿主机, --restart=always 表示重启  doc

    2024年02月20日
    浏览(48)
  • 数据持久化的利器,Python中的pickle模块详解

    📚 个人网站:涛哥聊Python Python数据序列化和反序列化时, pickle 模块是一个非常有用的工具。它允许将Python对象转换为字节流,以便存储在文件中或通过网络传输,然后将这些字节流重新转换回Python对象。 pickle 是Python标准库中的一个模块,用于将Python对象序列化(pickling)

    2024年02月19日
    浏览(39)
  • Redis两种持久化方案RDB持久化和AOF持久化

    Redis持久化 Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件

    2024年02月14日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包