Docker容器数据卷

Docker容器数据卷
  1. 简介
docker的理念:将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,
容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,
使得数据作为容器的一部分保存下来,那么当容器被删除之后,
数据也就没了,为了能够保存数据,在docker容器中使用卷。
卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点
  1. 作用
卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
   1. 数据卷可以在容器之间共享和重用数据。
   2. 卷的更改可以直接生效。
   3. 数据卷的更改不会包含在镜像的更新中。
   4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据

  1. 数据卷
容器内添加数据卷的两种方式

 1.直接命令添加:
  命令
   docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
     
          docker run -it -v /myDataVolume:/datavolumeContainer centos
          
          将宿主机目录与容器内目录绑定,容器目录内生成的文件,在宿主机目录中也存在一份同步的数据
   
          
          查看数据卷是否挂载成功。
    使用docker imspect 容器ID,返回的json串有这么一串数据说明挂载成功。
    
     2.DockerFile添加
        根目录下新建mydocker文件
        可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
        File构建(Dockerfile)
        docker build -f ./Dockerfile -t zzmm/centos .
        build后生成镜像    ,获得一个新的镜像 zzmm/centos
        docker run -it zzmm/centos      #run容器,由镜像文件生成容器,不需要  /bin/bash,Dockerfile 文件中已包含该指令
        此时会进入到新容器的根目录,
        ls -l    查看
        容器内会有dataVolumeContainer1  和  dataVolumeContainer2   两个数据卷目录
        容器内的卷目录地址已知--->()
        对应的主机目录地址在哪?
            进入宿主机
            docker ps   查看zzmm/centos  容器id
            docker inspect 容器id
            可以看到:
                "Source": "/var/lib/docker/volumes/e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329/_data",
                "Source": "/var/lib/docker/volumes/12717a9d775db7dccfc3c130a4d58f8a1a6340c1f36be1a099627c744c478f50/_data",
            解析:使用Dockerfile  生成 数据卷,没有指定宿主机路径时,默认会在该目录下会有与容器数据卷绑定的目录文件
                测试:
                      在容器的数据卷dataVolumeContainer1中添加文件            -rw-r--r--. 1 root root 0 Nov  4 08:33 containt01.txt
                      再开个窗口进入宿主机,进入目录/var/lib/docker/volumes/e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329/_data
                     此时存在文件 containt01.txt
                    因此可验证宿主机有与容器zzmm/centos  中数据卷对应文件目录

        
    容器和宿主机之间通信
    
    容器关闭后在宿主机更改文件,容器再次启动数据仍然同步
    
    命令(带权限)
  docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名  (read only)
  此时主机能对数据卷进行更改,但是容器不能对其更改,只允许读。
  • Dockerfile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------------success1"
CMD /bin/bash
  • build生成镜像的过程
[root@centos7-basic mydocker]# pwd
/home/zhoumm/homeRoot/mydocker
[root@centos7-basic mydocker]# docker build -f ./Dockerfile -t zzmm/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
 ---> 0f3e07c0138f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in bf779547b0d8
Removing intermediate container bf779547b0d8
 ---> 77370ed61f39
Step 3/4 : CMD echo "finished,------------success1"
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in ea5d6a998b21
Removing intermediate container ea5d6a998b21
 ---> 7e55e1deb959
Step 4/4 : CMD /bin/bash
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in d14088f09d67
Removing intermediate container d14088f09d67
 ---> 0f897b9ef509
Successfully built 0f897b9ef509
Successfully tagged zzmm/centos:latest
  • 主机生成的与容器数据卷对应的目录
[root@centos7-basic volumes]# pwd
/var/lib/docker/volumes
[root@centos7-basic volumes]# ll
total 24
drwxr-xr-x. 3 root root    19 Nov  4 16:21 12717a9d775db7dccfc3c130a4d58f8a1a6340c1f36be1a099627c744c478f50
drwxr-xr-x. 3 root root    19 Nov  4 16:21 e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329

  1. 数据卷容器
  • 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器 (活动硬盘上挂载活动硬盘,实现数据依赖)
  • 容器间的传递共享(–volumes from)
#以dc01做父容器
exit  退出
docker ps      # 没有容器在运行
宿主机执行   docker run -it --name dc01 zzmm/centos
查看容器:
[root@centos7-basic zhoumm]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a31838be046d        zzmm/centos         "/bin/sh -c /bin/bash"   5 minutes ago       Up 5 minutes                            dc01

宿主机执行   docker run -it --name dc02 --volumes-from dc01 zzmm/centos
容器查看:
[root@centos7-basic zhoumm]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d61c930d46b6        zzmm/centos         "/bin/sh -c /bin/bash"   2 minutes ago       Up 2 minutes                            dc02
a31838be046d        zzmm/centos         "/bin/sh -c /bin/bash"   10 minutes ago      Up 10 minutes                           dc01

此时dc01中的数据卷,在dc02中也存在,若在的dc01容器的数据卷中添加文件,在dc02容器对用的数据卷中也会有,验证了继承性,父到子,子到父实现共享

docker rm -f dc01
若1,删除容器dc01,  则容器dc02,dc03依然存在,文件也存在,
若2,再再dc02容器中添加文件,那再dc03容器中依然存在新增的文件
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值