1. 程式人生 > >docker學習-05容器資料卷

docker學習-05容器資料卷

Docker的理念:

    *  將運用與執行的環境打包形成容器執行 ,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的
    *  容器之間希望有可能共享資料

    Docker容器產生的資料,如果不通過docker commit生成新的映象,使得資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。
    為了能儲存資料在docker中我們使用卷。

容器資料卷:儲存資料。

一句話:有點類似我們Redis資料備份(rdb和aof檔案)。

卷:

      目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供一些用於持續儲存或共享資料的特性:
     卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷.

特點:
1:資料卷可在容器之間共享或重用資料
2:卷中的更改可以直接生效
3:資料卷中的更改不會包含在映象的更新中
4:資料卷的生命週期一直持續到沒有容器使用它為止

作用:

      1. 容器的持久化
      2.容器間繼承+共享資料

資料卷: 容器內新增 -v /宿主主機目錄:/容器內目錄
    直接命令新增:

命令 docker run -it -v /宿主機絕對路徑目錄:/容器內目錄      映象名
檢視資料卷是否掛載成功:docker inspect 容器ID
容器和宿主機之間資料共享:宿主機資料改變,容器也會自動同步過去。
容器停止退出後,主機修改後資料是否同步:容器啟動自動同步。
命令(帶許可權) docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名

    DockerFile新增:

根目錄下新建mydocker資料夾並進入
可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷:
     VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
     出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
     由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
File構建:
     vim dockerfile2
  內容:
     # volume test
     FROM centos
     VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
     CMD echo "finished,--------success1"
     CMD /bin/bash
build後生成映象:
     docker build -f /mydocker/dockerfile2 -t zhw/centos . 獲得一個新映象zhw/centos
run容器:
     docker run -it 808080203 /bin/bash
     ll 發現出現了兩個資料夾 dataVolumeContainer1 dataVolumeContainer2

Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
   解決辦法:在掛載目錄後多加一個--privileged=true引數即可。

資料卷容器:資料共享

    命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器。

案例:

總體介紹:
      以上一步新建的映象zhw/centos為模板並執行容器dc01/dc02/dc03
      它們已經具有容器卷
         /dataVolumeContainer1
         /dataVolumeContainer2
容器間傳遞共享(--volumes-from):

  先啟動一個父容器dc01 docker run -it --name dc01  zhw/centos
  在dataVolumeContainer2新增內容 touch dco1_add.txt
  dc02/dc03繼承自dc01(--volumes-from):
    命令:
        docker run -it --name dc02  --volumes-from dc01   zhw/centos
        docker run -it --name dc03  --volumes-from dc01   zhw/centos
  dc02/dc03分別在dataVolumeContainer2各自新增內容 touch dco2_add.txt touch dco13_add.txt
  回到dc01可以看到02/03各自新增的都能共享了

結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止.