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各自新增的都能共享了
結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止.