Docker容器數據卷

是什麼?

先來看看Docker的理念:git

  • 將運用與運行的環境打包造成容器運行 ,運行能夠伴隨着容器,可是咱們對數據的要求但願是持久化的
  • 容器之間但願有可能共享數據

Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使得數據作爲鏡像的一部分保存下來,
那麼當容器刪除後,數據天然也就沒有了。github

爲了能保存數據在docker中咱們使用卷。docker

  • 一句話:有點相似咱們Redis裏面的rdb和aof文件

能幹嗎

  • 卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:centos

  • 卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷tomcat

特色:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改能夠直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命週期一直持續到沒有容器使用它爲止bash

容器的持久化

容器間繼承+共享數據

數據卷

容器內添加

直接命令添加

  • 命令:
docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
  • -v表示volume,卷
    在這裏插入圖片描述
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄      鏡像名
  • 案例:在宿主機上和centos鏡像之間新建文件夾互通
docker run -it -v /myDataVolum:/dataVolumContainer centos /bin/bash

在這裏插入圖片描述
能夠看出命名執行完就進入到一個鏡像名爲a82ff6c30fbb的centos下,查看centos下有dataVolumContainer這個新建的文件夾
在這裏插入圖片描述
進入到宿主機,發現也會新建個myDataVolum,這兩個文件夾中的數據是互通的測試

  • 查看數據卷是否掛載成功
docker inspect 容器ID

在這裏插入圖片描述

docker inspect a82ff6c30fbb

在這裏插入圖片描述
在這裏插入圖片描述

  • 容器和宿主機之間數據共享
    在這裏插入圖片描述
    案例:測試宿主機和容器是否共享數據
    在宿主機新建一個a.txt文件
    在這裏插入圖片描述
    容器中寫入數據,如:hello docker!
    在這裏插入圖片描述
    在宿主機上查看寫入的內容:
    在這裏插入圖片描述
  • 容器中止退出後,主機修改後數據是否同步
    在這裏插入圖片描述
    案例:先exit退出容器,在宿主機新建文件並寫入數據。而後再從新啓動容器,看寫入的數據是否同步。
    新建b.txt文件,寫入:test
    在這裏插入圖片描述
docker ps -l
-l :顯示最近建立的容器。

在這裏插入圖片描述
啓動centos鏡像ui

docker start a82ff6c30fbb
docker attach a82ff6c30fbb

在這裏插入圖片描述
數據一致:
在這裏插入圖片描述設計

  • 命令(帶權限)
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名

ro:表示只讀不可寫
在這裏插入圖片描述
RW:表示讀寫
在這裏插入圖片描述
結論:設置上述的權限時(設置ro),在共享文件夾中,容器中只能查看不能寫入3d

DockerFile添加

在這裏插入圖片描述

在這裏插入圖片描述

案例

mkdir mydocker
cd mydocker
  • 可在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

說明:

出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不可以直接在Dockerfile中實現。
因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。

  • File構建
    在這裏插入圖片描述

在這裏插入圖片描述

  • 在centos鏡像的根目錄裏新建兩個容器卷,而且打印出一段話
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
  • build後生成鏡像,參數 -f 表示docker file的路徑,-t 是命名空間,最後面一個點 「.」 ,表示在當前目錄下,若是在當前目錄下能夠不加參數 -f
  • 鏡像是一層套一層的,相似於花捲,上面的docker file的第一層是centos,第二層是容器卷。咱們只訪問最外層。
    在這裏插入圖片描述
    得到一個新鏡像zzyy/centos
docker build -f /mydocker/Dockerfile -t xdr630/centos .

運行後一層一層執行,以容器內的centos鏡像爲根本,就能夠建立另一個自定義的centos鏡像。
在這裏插入圖片描述
如今直接運行剛纔建立的容器,一運行就會直接在xdr630/centos 下建立兩個容器卷

docker images 容器名 能夠查詢images下是否有這個容器,如:
在這裏插入圖片描述

  • run容器
docker run -it xdr630/centos

在這裏插入圖片描述

  • 在自定義的centos的容器卷1中建立a.txt而且寫入 hello Docker!
    在這裏插入圖片描述

  • 容器內有兩個容器卷,沒有指定對應的宿主機上的路徑。但docker會有默認的對應的路徑
    在這裏插入圖片描述
    這裏注意的是最新版的centos鏡像中默認對應的宿主機的路徑在「Mounts」值中

在這裏插入圖片描述

  • 複製上述的路徑,在宿主機上查看,又實現了宿主機到容器的數據能夠是共享的
    在這裏插入圖片描述

在這裏插入圖片描述

  • 經過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪??
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 主機對應默認地址
    在這裏插入圖片描述
    最新版本的宿主機默認對應的路徑爲:
    /var/lib/docker/volumes/75326a87e1affc3eb80ed150430ff4aaa11c1d55ddc333f3fe0754098b964486/_data

備註

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

數據卷容器

是什麼?

命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器

整體介紹

  • 以上一步新建的鏡像zzyy/centos爲模板並運行容器dc01/dc02/dc03
  • 它們已經具備容器卷
    /dataVolumeContainer1
    /dataVolumeContainer2

容器間傳遞共享(--volumes-from)

  • 先啓動一個父容器dc01
  • 這裏的 --name 是本身自定義的名字,默認不寫的話是docker隨機給的名
    在這裏插入圖片描述
    在這裏插入圖片描述

在這裏插入圖片描述

  • 在dataVolumeContainer2新增內容
    在這裏插入圖片描述

  • dc02/dc03繼承自dc01
    --volumes-from
    命令

docker run -it --name dc02 --volumes-from dc01 xdr630/centos

在這裏插入圖片描述
發現有剛纔新增的文件

在這裏插入圖片描述
dc02/dc03分別在dataVolumeContainer2各自新增內容

  • 回到dc01能夠看到02/03各自添加的都能共享了
    -
  • 刪除dc01,dc02修改後dc03能否訪問
    在這裏插入圖片描述
  • 刪除dc02後dc03能否訪問
    在這裏插入圖片描述
    再進一步
    在這裏插入圖片描述
  • 新建dc04繼承dc03後再刪除dc03
    在這裏插入圖片描述
  • 結論:容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止
相關文章
相關標籤/搜索