4.docker数据卷

1.是什么?

docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么 当容器删除后,数据自然也就没有了。
为了能保存数据,在docker中我们使用卷。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
卷的设计目的就是数据的持久化,独立于容器的声明周期,因此docker不会在删除容器时删除其挂载的数据卷
特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止

2.能干嘛?

容器的持久化
容器间继承+共享数据

3.数据卷

1.直接命令添加

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

docker run -it -v /myDataVolume:/dataVolumeContainer centos
以centos镜像启动容器,并在宿主机/myDataVolume和容器内/dataVolumeContainer实现数据共享,若没有相应的目录,则创建

查看宿主卷是否挂在成功:
docker inspect 容器ID


clipboard.png
容器和宿主机间数据共享:
    容器内修改,创建文件均可以同步到主机内,反之亦然
    容器停止退出后,主机修改后数据是否同步:?
    完全同步

带权限:
    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro readonly)
    主机只可以单向的向容器内传数据,容器内只可以读数据,不可以写数据

2.DockerFile添加

DockerFile是什么?
    是描述镜像的文件
步骤:
    1.宿主机内新建mydocker文件夹并进入    mkdir mydocker  

    2.可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
    VOLUME["/dataVolumeContainer","/dataVolumeContainer02","/dataVolumeContainer03"]
    说明:
        出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
        由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录

    3.File构建
        mydocker文件夹下使用vim编辑器新建DockerFile文件(DockerFile语法下一篇介绍), vim DockerFile
       
        FROM centos
        VOLUME ["/dataVolumnContainer1","/dataVolumnContainer2"]
        CMD echo "finished,-------successs1"
        CMD /bin/bash

    4.build生成镜像
        将DocekrFile文件
        docker build -f /mydocker/DockerFile -t huan/centos:1.0 .  (最后的.不能少  会报错  坑啊!!)
        出现Successfully built xxxx即成功构建
     
    5.run镜像
      容器启动后就自动创建了文件夹
      docker images 查看自己本地镜像,获取创建的镜像id
clipboard.png

通过上述步骤容器内的卷目录地址已经知道。

可以使用docker inspect 容器id 查看容器相应信息,包括容器对应的主机目录地址

备注:
Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true 参数即可
docker run -it -v /宿主机绝对路径目录:/容器内目录 --privileged=true 镜像名

4.数据卷容器

概念:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
作用:容器间数据传递共享

以上一步新建的镜像为模板,新建容器dc01、dc02、dc03,它们已经有了容器卷
dc02的数据来自于dc01?

先启动一个父容器dc01
    docker run -it --name dc01 huan/centos
    dataVolumnContainer2文件夹下新建文件dc01.txt

启动容器dc02,继承自dc01
    docker run -it --name dc02 --volumes-from dc01 huan/centos:1.0
    查看容器dc02,dataVolumnContainer2,可以看到父容器新建的文件,新建dc02.txt

启动dc容器dc03,继承自dc01
    docker run -it --name dc03 --volumes-from dc01 huan/centos:1.0
    查看容器dc03,dataVolumnContainer2,可以看到父容器新建的文件,以及dc02的文件 dc01.txt、dc02.txt
    新建dc03.txt,ctrl+p+q,退出但不停止容器

重新进入dc01容器,查看dataVolumnContainer2文件夹,可以看到dc01.txt.dc02.txt.dc03.txt,容器间数据达到共享
删除dc01容器,进入dc02容器,新建dc02_update.txt,退出,进入dc03容器,可以发现dc02_update.txt!
即使父容器dc01删除,02和03容器依然可以共享数据

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

猜想:dc02 dc03均继承自dc01,也继承了dc01的数据卷,dc01和宿主机之间数据是共享的,那么dc02 dc03也是如此!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容