您好,登錄后才能下訂單哦!
要了解Docker Volume,首先我們需要理解Docker文件系統(tǒng)的工作原理。Docker鏡像是由多個文件系統(tǒng)的只讀層疊加而成。當(dāng)一個容器通過命令docker run啟動時,Docker會加載只讀鏡像層并在鏡像棧頂部添加一個讀寫層。如果運行中的容器修改了現(xiàn)有的一個已經(jīng)存在的文件,那該文件將會從讀寫層下面的只讀層復(fù)制到讀寫層,但是該文件的只讀版本依然存在,只不過已經(jīng)被讀寫層中該文件的副本所隱藏。
當(dāng)刪除Docker容器,并通過該鏡像重新啟動時,之前在讀寫層的更改將會丟失。在Docker中,只讀層及在頂部的讀寫層的組合被稱為Union File System(聯(lián)合文件系統(tǒng)),簡稱UnionFS,它用到了一個重要的資源管理技術(shù),叫寫時復(fù)制。寫時復(fù)制(copy-on-write),也叫隱式共享,是一種對可修改資源實現(xiàn)高效復(fù)制的資源管理技術(shù)。對于一個重復(fù)資源,若不修改,則無需立刻創(chuàng)建一個新的資源,該資源可以被共享使用。當(dāng)發(fā)生修改的時候,才會創(chuàng)建新資源。這會大大減少對于未修改資源復(fù)制的消耗。其實COW這個概念對編程人員來說一點也不陌生,廣泛用在各種領(lǐng)域,比如ABAP里對于內(nèi)表(Internal table)的拷貝動作,Java字符串的拷貝實現(xiàn)等等。Docker基于UnionFS去創(chuàng)建containers。
我們下面看一個實際例子。
使用命令行docker run --help查看這個命令的幫助文檔。 -h 的作用是指定容器的主機名。
使用命令行創(chuàng)建一個新的容器:
docker run -it --name jerry-container-test -h CONTAINER -v /data busybox /bin/sh
名稱為jerry-container-test, 用-v創(chuàng)建了一個volume /data
創(chuàng)建完畢之后,在容器里執(zhí)行cd /data進入這個目錄,這個時候還是空的。
docker ps查看容器狀態(tài):
現(xiàn)在我想知道主機上為了實現(xiàn)這個volume,使用了哪個internal目錄。
用命令docker inspect jerry-container-test查看關(guān)鍵字"volumes":
得到了容器里/data在主機上實現(xiàn)的目錄:
/var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data
現(xiàn)在我在主機上使用touch命令在這個目錄下直接創(chuàng)建一個文件:
sudo touch /var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data/test.s
現(xiàn)在切換到容器里,用ls也能看到直接在主機上用touch命令在internal folder里創(chuàng)建的文件了。
要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。