資料卷提供了一種主機和容器共享資料的方式,有些時候需要用它來做持久化和資料共享。當做持久化時,通常資料卷都會比較大,可以将其放在單獨的磁盤、卷或者陣列上,這個時候容器隻是一個執行環境。當做資料共享時,可以用于開發和測試分布式系統,如需要用到共享盤、處理fencing 等。資料卷主要通過-v 參數來指定。
若需要一個外部卷來存放持久化資料,而不想把資料包含在容器内部。例如:
這條指令建立了一個名為datatest 的容器,同時為其建立了一個/webapp 的資料卷,這是資料卷在其内部的位置。那麼它在主機上的什麼位置呢?
它的位置在/var/lib/docker 下。
如果以-v src:des 的方式指定,那麼容器則會直接将主控端的目錄挂載到容器内部:
将主控端/root 目錄映射到了容器/hostroot 目錄中。此時,使用者可以在容器中對主控端/root 目錄中的檔案進行修改,但這種操作是非常危險的。在做資料卷映射時,一定要特别小心,任何時候都不要将主控端的根目錄映射到容器内部。
由于容器本身就可以包含檔案系統,那麼可不可以把容器的卷分享給另一個容器用呢?答案是可以的。具體的步驟如下。
(1)建立一個包含外部卷的容器,注意是create,并不是run。run 是create 後再start,本例隻需要容器的檔案系統,是以隻需要create.
(2)在另一個容器中通過--volumes-from 來映射。
下面是通過容器型資料卷和資料卷聯合使用做備份的例子。
剖析:
volumes-from 表示使用dbstore 這個容器的資料卷;
v $(pwd):/backup 表示将目前路徑映射到容器的/backup 中,用于後續備份;
ubuntu tar cvf /backup/backup.tar /dbdata 表示将/dbdata 的内容備份到目前目錄。
上面這個例子就是典型的将容器作為一個工具來使用的例子,如果更進一步,使用者可以自己寫一個dockerfile,然後産生一個image,将參數都指定好,以後隻需啟動容器就可備份,備份完成後又自動退出。
那麼還原呢?
類似地,通過tar 來解壓即可。
資料卷有下面幾個特點:
資料卷在容器建立時進行初始化;
資料卷既可以共享,也可以在容器之間重用;
對于資料卷的讀寫是直接下發的;
commit 指令不會将改動儲存到鏡像中;
即使容器被删除了,資料卷仍然存在,是以這一塊需要特别注意,避免産生垃圾資料卷。
想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。