• (07)Docker容器之数据卷


      1、数据卷及其作用

      Docker理念是将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望有可能共享数据。Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷,一句话:有点类似我们Redis里面的rdb和aof文件。

      卷的作用有两个:做容器的持久化;容器间继承+共享数据。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。

      特点:
      1、数据卷可以在容器之间共享或重用数据
      2、卷中的更改可以直接生效
      3、数据卷中的更改不会包含在镜像的更新中
      4、数据卷的生命周期一直持续到没有容器使用它为止

      2、容器内添加数据卷

      有两种方式:直接命令添加;DockerFile添加

      (1)直接命令添加

      1)命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

    [root@localhost ~]# docker run -it -v /myDataVolume:/dataVoContainer cento

      2)查看数据卷是否挂载成功,看到宿主机和容器内部都成功创建了对应目录,宿主机和容器可以共享数据了

      使用docker inspect命令也可以查看

    docker inspect 92afd4685d89

      3)容器和宿主机之间数据共享:在宿主机内创建test.txt在容器内可以读取到并修改,在容器内新建的test2.txt在宿主机中可以读到。

      4)容器停止退出后,主机修改后数据是否同步。此时容器内和宿主机的文件如下:

      在宿主机内新增、修改文件,然后启动容器,发现数据已经同步

      5)命令(带权限)

      命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

      作用:宿主机可以写文件,但是容器内的目录中只能读文件,不能修改,也不能写

      演示:首先清空宿主机和容器内相关目录的文件,然后exit容器。

    [root@localhost myDataVolume]# docker run -it -v /myDataVolume:/dataVoContainer:ro centos

      (2) DockerFile添加

      DockerFile理解为镜像模板的描述文件。去https://github.com/看一下tomcat的部分DockerFile,用到了jdk:

      创建数据卷使用:VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]。由于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

      1)根目录下新建mydocker文件夹并进入

    [root@localhost /]# mkdir mydocker
    [root@localhost /]# cd mydocker
    [root@localhost mydocker]# pwd
    /mydocker

      2)可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。构建File文件

    [root@localhost mydocker]# vim Dockerfile
    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,--------successl"
    CMD /bin/bash

      FROM centos:来自于父类的镜像

      VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]:新建两个数据卷

      整个文件类似于:docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash

      3)build后生成镜像

    docker build -f /mydocker/Dockerfile -t sl/centos .

      -f:指明dockerfile路径

      -t:指明命令空间和镜像名字

      .:当前目录

      4) run容器

    [root@localhost mydocker]# docker run -it sl/centos

      容器内已经创建了两个数据卷,可使用docker inspect image查看宿主机对应目录,同样具有数据共享、读写权限 。 

    [root@localhost mydocker]# docker inspect e042513c1a91

      备注 :Docker挂载主机目录,Docker访问出现cannot open directory .:Permission denied

      解决办法:在挂载目录后多加一个--privileged=true参数即可

      如:docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true 镜像名

  • 相关阅读:
    换个角度认识大数据(上)——何为元数据
    如何优雅地停止Spark Streaming Job
    split("\,")引起的java.lang.ArrayIndexOutOfBoundsException异常解决方案
    spark streaming整合kafka
    Kafka相关命令
    Hive性能调优(二)----数据倾斜
    Hive SQL编译过程(转)
    Hive性能调优(一)----文件存储格式及压缩方式选择
    Hive表的几种存储格式
    spring框架之javaconfig
  • 原文地址:https://www.cnblogs.com/javasl/p/12734373.html
Copyright © 2020-2023  润新知