第5章 Docker容器資料卷
1.1 是什麼
先來看看Docker的理念:
* 將運用與執行的環境打包形成容器執行 ,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的
* 容器之間希望有可能共享資料
Docker容器產生的資料,如果不通過docker commit生成新的映象,使得資料做為映象的一部分儲存下來,
那麼當容器刪除後,資料自然也就沒有了。
為了能儲存資料在docker中我們使用卷。
一句話:有點類似我們Redis裡面的rdb和aof檔案
1.2 能幹嘛
卷就是目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供一些用於持續儲存或共享資料的特性:
卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷
特點:
1:資料卷可在容器之間共享或重用資料
2:卷中的更改可以直接生效
3:資料卷中的更改不會包含在映象的更新中
4:資料卷的生命週期一直持續到沒有容器使用它為止
● 容器的持久化
● 容器間繼承+共享資料
1.3 資料卷:容器內新增
1.3.1 直接命令新增
1.3.1.1 命令
docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
即 docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名
1.3.1.2 檢視資料卷是否掛載成功
docker inspect 容器ID
1.3.1.3 容器和宿主機之間資料共享
1.3.1.4 容器停止退出後,主機修改後資料是否同步
1.3.1.5 命令(帶許可權)
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名
1.3.2 DockerFile新增
1.3.2.1 根目錄下新建mydocker資料夾並進入
1.3.2.2 可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
1.3.2.3 File構建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
1.3.2.4 build後生成映象
獲得一個新映象zzyy/centos
1.3.2.5 run容器
1.3.2.6 通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪??
1.3.2.7 主機對應預設地址
1.3.3 備註
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true引數即可
1.4 資料卷容器
1.4.1 是什麼
命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器
1.4.2 總體介紹
以上一步新建的映象zzyy/centos為模板並執行容器dc01/dc02/dc03
它們已經具有容器卷
● /dataVolumeContainer1
● /dataVolumeContainer2
1.4.3 容器間傳遞共享(--volumes-from)
1.4.3.1 先啟動一個父容器dc01:在dataVolumeContainer2新增內容
1.4.3.2 dc02/dc03繼承自dc01
--volumes-from
命令:docker run -it --name dc02 --volumes-from dc01 zzyy/centos
dc02/dc03分別在dataVolumeContainer2各自新增內容
1.4.3.3 回到dc01可以看到02/03各自新增的都能共享了
1.4.3.4 刪除dc01,dc02修改後dc03可否訪問
1.4.3.5 刪除dc02後dc03可否訪問,再進一步
1.4.3.6 新建dc04繼承dc03後再刪除dc03
1.4.3.7 結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止