zoukankan      html  css  js  c++  java
  • 深入浅出容器学习--Docker数据卷

    一.Docker数据卷

    Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Docker会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重启时,之前的修改将会丢失。在Docker中,只读层和顶部的读写层的组合被称为联合文件系统(Union File System)。
    Docker镜像可以理解成多个只读文件叠加而成,因此镜像是只读的,当镜像运行起来时,就相当于在只读的镜像外包裹了一层读写层变成了容器。当删除容器之后,使用镜像重新创建一个容器时,此时的镜像的只读层和原来一样,只是在读写层的修改会全部丢失。
    Docker提供了三种不同的方式,用于将宿主机的数据挂载到容器中:

    • volumes:器内的数据被存放到宿主机(linux)一个特定的目录下(/var/lib/docker/volumes/)。这个目录只有Docker可以管理,其他进程不能修改。如果想持久保存容器的应用数据,Volumes是Docker推荐的挂载方式。
    • bind mounts:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统目录或文件中。除了Docker之外的进程也可以任意对他们进行修改。
    • tmpfs:容器的数据只会存放到宿主机的内存中,不会被写到宿主机的文件系统中,因此不能持久保存容器的应用数据。

    1.1 volumes

    Volumes:

    • 由Docker进程创建和管理,可以通过命令docker volume create来创建一个指定的卷,也可以由Docker进程在创建容器或服务的过程中来创建。
    • 当为一个容器创建一个volume时,这个volume将会被存储到宿主机的一个目录下,当你挂载这个volume到一个容器中时,就是在挂载这个目录到容器中。
    • 一个volume可以被同时挂载到多个容器中。当没有任何容器在使用这个volume的时候,这个volume也仍然可以被Docker进程所使用,而不是自动删除。当前这里可以使用命令手动删除volume:docker volume prune
    • 当你挂载一个volume时,可以选择为它命名,也可以不命名。如果不命名的话,当这个volume首次被挂载到一个容器中时,Docker进程会分配给他一个随机的名字,以保证在宿主机操作系统中这个volume的名字唯一。除了名字之外,命名和不命名的volume没有区别。
    • volume也支持使用volume drivers,以帮助你将数据保持到远程主机或云上。

    Volumes是Docker管理宿主机文件系统的一部分,默认位于/var/lib/docker/volumes目录中:

    由上图可以看出,目前所有的Container数据都保存在了这个目录下,由于没有在创建的时候指定卷,所以Docker帮我们创建了许多匿名的卷(就是一堆很长ID名字的卷)

    适用场景:

    • 多个容器间需要共享数据。如果volume没有手动被创建,它将会在首次挂载到某个容器之前被自动创建,当容器被停止或删除时,这个volume不会随之被删除。多个容器可以同时以rw或ro的方式挂载这个volume。只有手动指定删除volume,它才会被删除。
    • 当宿主机并没有专用于Docker的文件系统结构时。使用volume可以使宿主机的配置与容器的运行解耦。
    • 当你希望将数据保存到远程主机或云上。
    • 你希望在不同的宿主机直接备份/恢复/迁移数据时,volume是一个很好的选择。你可以停止运行使用volume的容器,然后直接备份volume所在的目录即可,如/var/lib/docker/volumes/

    1.2 bind mounts

    Bind mounts:

    • 与volume相比,它的功能比较局限。当使用bind mounts时,宿主机的目录或文件被挂载到容器中。容器将按照挂载目录或文件的绝对路径来使用或修改宿主机的数据。宿主机中的目录或文件不需要预先存在,在需要的使用会自动创建。使用bind mounts在性能上是非常好的,但这依赖于宿主机有一个目录妥善结构化的文件系统。(使用bind mounts的容器可以在通过容器内部的进程对主机文件系统进行修改,包括创建,修改和删除重要的系统文件和目录,这个功能虽然很强大,但显然也会造成安全方面的影响,包括影响到宿主机上Docker以外的进程)

    适用场景:

    • 将宿主机的系统配置文件共享给容器,这是Docker为容器提供DNS配置的默认方式,即通过bind mounts的方式将宿主的的/etc/resolv.conf文件挂载到容器中。
    • 将宿主机开发环境中的源代码或实验结果共享给容器。例如:你在宿主机上进行一个项目Maven的测试,每次你在宿主机上对Maven项目进行了更改后,容器就可以直接获取更改后的结果
    • 你可以确定宿主机的文件系统结构应该与容器内部完全一致时。

    1.3 tmpfs mounts

    tmpfs:

    • 在这种挂载方式下,容器内的应用数据将不会被持久的保存在硬盘上。其中的数据只能在某个容器的生存周期内被使用,或者用于保存一些不需要持久存储或者一些敏感的数据信息。

    适用场景:
    当你出于安全原因,或者容器性能优化的原因(如需要写入大量的不持久的状态数据时),不需要容器的数据长久保存时可以使用这种方式。

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/13877692.html
Copyright © 2011-2022 走看看