zoukankan      html  css  js  c++  java
  • docker数据持久化

    如果想让数据持久保留,两种方法:

    1、Docker 的绑定挂载功能,这个功能可以将宿主系统的文件或文件夹挂载到容器里

    2、使用 Docker 卷来创建一个卷并挂载到容器里。

    下面我们就一起来了解下这两种方法以及如何使用。

    Docker 数据持久化

    Docker 绑定挂载

    Docker 绑定挂载可以让宿主系统的文件夹挂载到容器里,常用于文件共享,也可以用于数据持久化,不过官方更推荐使用 Docker 卷(等会讲)。

    绑定挂载需要在创建容器的时候进行挂载,挂载的方式也很简单,只需要添加-v参数。

    例如:

    在宿主系统创建一个/tmp/jason文件夹并创建一个test文档,文档内容为“hello,jason”:

    mkdir /tmp/jason
    echo "hello,jason" >/tmp/jason/test.txt

    查看test.txt

     创建一个容器将刚刚创建的文件夹挂载到容器里

    docker run -itd -v /tmp/jason:/test --name mivm alpine /bin/sh

    -v后面的两个参数,第一个是宿主系统路径,第二个是挂载目标路径,可以用来挂载文件夹,也可以用来挂载文件,而且可以挂载多个,只需要添加多个-v即可,如果宿主系统里不存在文件夹,Docker 会自动创建文件夹。

    默认情况下 mount 的数据是可读可写的。我们可以添加 ro 参数设置成只读权限,此时:

      • 在容器中无法对 bind mount 数据进行修改。 
      • 只有 host 有权修改数据。

    例如:

    docker run -itd -v /tmp/jason:/test:ro  --name mivm alpine /bin/sh

     我们从容器修改文件,会发现没有权限

    如果容器目标文件夹里有文件,宿主机文件夹没有文件,则容器的文件夹会被隐藏

    验证

    使用容器读取刚刚挂载的文件夹的文件,看是否和宿主机上的test.txt文件类容一样

    docker exec mivm cat /test/test.txt

     在容器创建一个新的文本文档mivm.txt,在宿主机上查看

    docker exec mivm /bin/sh -c "echo "Hello mivm" > /test/mivm.txt"

     删除容器,查看宿主机文件是否还存在

    docker stop mivm &&docker rm mivm

    查看宿主机

    新创建容器   mivm-test绑定挂载宿主机刚才的目录,来继续使用刚才的文件

    docker run -itd -v /tmp/jason:/test --name mivm-test  alpine /bin/sh

    进入容器查看  /test目录

    docker exec -it mivm-test /bin/sh

     可以看到文件还在

    这是第一种数据持久化的方法,在大多数情况下都适用

    Docker 卷

    如果想持久化容器里已有的文件,需要创建一个 Docker 卷,把卷挂载到容器里的/usr/bin,由于 Docker 卷的特性,新卷可以通过容器预先填充内容,所以容器里的/usr/bin的内容会被写入到卷里。

    • 创建:docker volume create
    • 删除某个卷:docker volume rm 卷名    删除卷之前先确保卷没有被容器使用
    • 删除所有未使用的卷:docker volume prune
    • 列出所有卷:docker volume ls
    • 查看某个卷的信息:docker volume inspect 卷名

    例子:

    创建一个volume卷

    docker volume create mivm-data

    查看该卷

    验证:

    创建一个容器将刚刚创建的卷挂载到容器里

    docker run -itd -v mivm-data:/tmp/test --name mivm alpine /bin/sh

     -v后面的两个参数,第一个是卷名称,第二个是挂载目标路径,卷名称必须存在,Docker 不会自动创建卷。

    列出容器的文件

    docker exec mivm ls /tmp/test

     可以看到是空的

    使用容器向挂载点写入文件

    docker exec mivm /bin/sh -c "echo "Hello mivm" > /tmp/test/mivm.txt"

    结束并删除掉容器

    docker stop mivm && sudo docker rm mivm

    重新创建新容器并挂载mivm-data卷

    docker run -itd -v mivm-data:/tmp/test --name mivm-test-1 alpine /bin/sh

     读取我们刚刚写入的文件

    docker exec mivm-test-1 cat /tmp/test/mivm.txt

    参考:

    https://www.hangge.com/blog/cache/detail_2403.html

    http://c.biancheng.net/view/3203.html

    https://www.qikqiak.com/k8s-book/docs/6.数据共享与持久化.html

  • 相关阅读:
    Spring Boot 结合 Redis 序列化配置的一些问题
    基于SpringBoot的代码在线运行的简单实现
    将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0
    用Spring Security, JWT, Vue实现一个前后端分离无状态认证Demo
    使用最新AndroidStudio编写Android编程权威指南(第3版)中的代码会遇到的一些问题
    C# 内存管理优化畅想----前言
    C# 内存管理优化实践
    C# 内存管理优化畅想(三)---- 其他方法&结语
    C# 内存管理优化畅想(二)---- 巧用堆栈
    C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩
  • 原文地址:https://www.cnblogs.com/xiaoyou2018/p/11778186.html
Copyright © 2011-2022 走看看