要了解Docker Volume,首先咱們須要理解Docker文件系統的工做原理。Docker鏡像是由多個文件系統的只讀層疊加而成。當一個容器經過命令docker run啓動時,Docker會加載只讀鏡像層並在鏡像棧頂部添加一個讀寫層。若是運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫層下面的只讀層複製到讀寫層,可是該文件的只讀版本依然存在,只不過已經被讀寫層中該文件的副本所隱藏。docker
當刪除Docker容器,並經過該鏡像從新啓動時,以前在讀寫層的更改將會丟失。在Docker中,只讀層及在頂部的讀寫層的組合被稱爲Union File System(聯合文件系統),簡稱UnionFS,它用到了一個重要的資源管理技術,叫寫時複製。寫時複製(copy-on-write),也叫隱式共享,是一種對可修改資源實現高效複製的資源管理技術。對於一個重複資源,若不修改,則無需馬上建立一個新的資源,該資源能夠被共享使用。當發生修改的時候,纔會建立新資源。這會大大減小對於未修改資源複製的消耗。其實COW這個概念對編程人員來講一點也不陌生,普遍用在各類領域,好比ABAP裏對於內表(Internal table)的拷貝動做,Java字符串的拷貝實現等等。Docker基於UnionFS去建立containers。編程
咱們下面看一個實際例子。命令行
使用命令行docker run --help查看這個命令的幫助文檔。 -h 的做用是指定容器的主機名。 3d
使用命令行建立一個新的容器:blog
docker run -it --name jerry-container-test -h CONTAINER -v /data busybox /bin/sh 名稱爲jerry-container-test, 用-v建立了一個volume /data 資源
建立完畢以後,在容器裏執行cd /data進入這個目錄,這個時候仍是空的。 文檔
docker ps查看容器狀態: 字符串
如今我想知道主機上爲了實現這個volume,使用了哪一個internal目錄。it
用命令docker inspect jerry-container-test查看關鍵字"volumes": io
獲得了容器裏/data在主機上實現的目錄:
/var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data
如今我在主機上使用touch命令在這個目錄下直接建立一個文件:
sudo touch /var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data/test.s
如今切換到容器裏,用ls也能看到直接在主機上用touch命令在internal folder裏建立的文件了。
要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":