上一篇:Docker的那些事兒—Docker數(shù)據(jù)管理(28)
數(shù)據(jù)卷是一個(gè)或多個(gè)容器專門指定繞過Union File System,為持續(xù)性或共享數(shù)據(jù)提供一些有用的功能:
(1)數(shù)據(jù)卷可以在容器間共享和重用。
(2)數(shù)據(jù)卷數(shù)據(jù)的改變是直接修改的。
(3)數(shù)據(jù)卷數(shù)據(jù)的改變不會(huì)被包括在容器中。
(4)數(shù)據(jù)卷是持續(xù)性的,直到?jīng)]有容器使用它們。
數(shù)據(jù)卷操作
Docker啟動(dòng)的時(shí)候可以通過-v選項(xiàng)添加數(shù)據(jù)卷,實(shí)現(xiàn)將主機(jī)上的目錄或者文件掛載到容器中。完整的參數(shù)為:
-v host-dir:container-dir:[rw|wo]
-v container-dir:[rw|wo]
-v volume-name:container-dir:[rw|wo]
其中,
host-dir:表示主機(jī)上的目錄,如果不存在,Docker 會(huì)自動(dòng)在主機(jī)上創(chuàng)建該目錄。必須是絕對(duì)路徑。
container-dir:表示容器內(nèi)部對(duì)應(yīng)的目錄,如果該目錄不存在,Docker 也會(huì)在容器內(nèi)部創(chuàng)建該目錄。
volume-name:表示卷名,如果該卷不存在,docker將自動(dòng)創(chuàng)建。
rw|ro:用于控制volume的讀寫權(quán)限。
(1)docker run -itd -P -v /test:/data --name myhttp httpd


在宿主機(jī)/test目錄下創(chuàng)建test.txt文件,觀察容器內(nèi)/data目錄下內(nèi)容變化


docker container inspect myhttp查詢Mounts參數(shù)如下:

刪除容器,宿主機(jī)上/test目錄及內(nèi)容未發(fā)生任何變化。
(2)docker run -itd -P -v /data --name myhttp httpd

我們看到容器內(nèi)出現(xiàn)了/data目錄。那這一次又是宿主機(jī)上哪個(gè)目錄掛載到/data下的呢?
我們使用docker volume ls查詢,發(fā)現(xiàn)多了一個(gè)本地卷:f343bc68303155c111bea58a907131d9fe1751bc8ef6528cc53d5b7dce292dee
使用docker volume inspect查詢到如下的掛下點(diǎn)目錄:
/var/lib/docker/volumes/f343bc68303155c111bea58a907131d9fe1751bc8ef6528cc53d5b7dce292dee/_data

當(dāng)在上述目錄下創(chuàng)建test.txt文件后,容器內(nèi)也查詢到該新增文件。


刪除容器后,宿主機(jī)上的目錄及內(nèi)容也未發(fā)生任何變化。
(3)docker run -itd -P -v my_volume:/data --name myhttp httpd

docker自動(dòng)創(chuàng)建了卷:my_volume,并且這個(gè)卷對(duì)應(yīng)的宿主機(jī)的掛載點(diǎn)是:
/var/lib/docker/volumes/my_volume/_data。這和第二種方式幾乎一樣,不同點(diǎn)在于未指定volume名是docker會(huì)在/var/lib/docker/volumes隨機(jī)創(chuàng)建一個(gè)目錄。

docker container inspect myhttp查詢Mounts參數(shù)如下:

對(duì)于docker數(shù)據(jù)卷的總結(jié):
(1) 三種方式都可以將宿主機(jī)目錄或者文件掛載到容器。
(2) Docker提供了docker volume命令專門對(duì)volume進(jìn)行管理。對(duì)于第一種方式Type為bind,是無(wú)法使用docker volume進(jìn)行管理的。我們也可以使用docker volume create命令創(chuàng)建volume。
(3) 刪除容器是如果使用docker rm container將不會(huì)刪除對(duì)應(yīng)的Volume。如果想要?jiǎng)h除可以使用docker rm -v container。另外也可以單獨(dú)使用docker volume rm volume_name刪除volume。
(4) 對(duì)于已運(yùn)行的數(shù)據(jù)卷容器,不能動(dòng)態(tài)的調(diào)整其卷的掛載。Docker官方提供的方法是先刪除容器,然后啟動(dòng)時(shí)重新掛載。