您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何使用Docker卷”,在日常操作中,相信很多人在如何使用Docker卷問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用Docker卷”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Docker 支持持久化和非持久化兩種方式的存儲。
每個容器都會被自動分配本地存儲。默認情況下,容器全部文件和目錄都是用該存儲的。非持久存儲屬于容器的一部分,并且與容器的生命周期一樣---容器創建時會創建非持久化存儲,同時該存儲也會隨著容器的刪除而刪除。
在 Linux 系統中,該存儲目錄在 /var/lib/docker/<storage-driver>
下,是容器的一部分。這個 storage-driver
是指要使用的存儲驅動。假如要想在生產環境中使用 Linux 運行 Docker,需要確認當前的存儲驅動是否符合當前 Linux 版本:
總的來說,Overlay2 驅動正在逐漸流行,可能在未來會成為大多數平臺上的推薦存儲驅動。
容器中持久化數據的方式推薦使用卷,也就是先創建卷,接著將卷掛載到容器上。這個時候,卷會掛載到容器文件系統的某個目錄中,任何寫到該目錄下的內容都會寫到卷中。即使容器被刪除了,卷及其上面的數據也仍然存在。
如下圖所示,Docker 卷就被掛載到了容器的 /code 目錄,那么任何寫入 /code 目錄中的數據其實都是寫入到 Docker 卷中,并且這個 Docker 卷在容器刪除之后依然存在。而其他目錄使用的都是臨時的本地存儲。
★卷本質就是 Docker 主機上的一個目錄。將 Docker 主機中的一個目錄掛載到了容器文件系統中的一個目錄后,此時操作容器文件系統中的目錄,其實就是操作相應的 Dokcer 主機上的目錄。也就是相當于容器不再僅僅只能訪問容器的文件系統了,還可以訪問所在 Docker 主機所在的文件系統了。
”
docker volumn create myvol # 創建名為 myvol 的卷
默認情況下,Docker 創建新卷時采用內置的 local 驅動,采用這個驅動也就說明創建的卷只能被容器所在的 Docker 主機所使用(上述所使用的就是 local 驅動)。
除了 local 驅動之外,你還可以使用 -d
參數指定不同的驅動。第三方驅動也可以通過插件方式接入,這些驅動提供了高級存儲特性,并為 Docker 集成了外部存儲系統。卷插件涵蓋了塊存儲、文件存儲、對象存儲等。
docker volumn ls
docker volumn inspect [VOLUMN_NAME]
inspect 命令會輸出相應卷的詳細信息,Driver 和 Scope 都是 local,那么表示這個卷使用默認 local 驅動創建,只能用于當前 Docker 主機上的容器。Mountpoint 表示卷位于 Docker 主機上的位置,使用 local 驅動創建的卷在 Docker 主機上均有專屬目錄。在 Linux 中則位于 /var/lib/docker/volumes
目錄下。
[
{
"CreatedAt": "2020-09-28T16:07:25+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": {},
"Scope": "local"
}
]
★Dockerfile 中可以使用
”VOLUMN <container-mount-point>
指令的方式部署卷。需要注意的是 Dockerfile 中無法指定主機目錄,因為主機目錄通常情況是相對主機的一個目錄(就是跟主機有關的目錄),那么這個目錄在不同主機間會不同,可能會導致構建失敗。如果通過 Dockerfile 指定,那么每次部署時都需要指定主機目錄。
docker container run -it --name voltainer --mount source=bizvol,target=/vol alpine
上述的命令創建了一個新的獨立容器,并將容器內的 /vol 目錄掛載到了名為 bizvol 的卷。假如容器的文件系統中沒有 /vol 這個目錄,那么會創建;假如已有這個目錄,那么則會使用這個目錄(該目錄的內容到時候會變成卷里面的內容)。同理,系統中沒有叫 bizvol 的卷,那么該命令也會創建一個這樣的卷;如果已經存在這個卷了,那么則使用這個卷。
假設,我們把這個容器給刪除了,那么 bizvol 這個卷還是在的。而且,你在容器運行過程中往 /vol 這個目錄中寫入的數據也在這個卷中。如下所示,在容器運行過程中先往 /vol/file 中寫入一段數據,然后退出并刪除容器。之后,查看卷所在的目錄,發現創建的文件和寫入的數據還是在的。
上面對卷的闡述更多是更多是從持久化的角度出發,而卷的另一大作用就是“打通”容器文件系統和主機文件系統,使得容器里在指定目錄下創建的文件可以被宿主機訪問到,也可以使得宿主機上指定目錄下的文件可以被容器里的進程訪問到。那么,這個是如何做到的呢?
這里主要用到了 Linux 的綁定掛載(bind mount)機制。它的主要作用就是將一個目錄或者文件掛載到一個指定的目錄上。并且,之后你在掛載點上進行的任何操作,都只發生在被掛載的目錄或者文件上,而原掛載點的內容則會被隱藏起來且不受影響。綁定掛載實際上是一個 inode 替換的過程。比如,執行 mount --bind /home /test
會將 /home 以 bind 的方式掛載到 /test 上。而這一操作其實就相當于將 /test 重定向到了 /home 的 inode 上。因此,當我們修改 /test 目錄的時候,實際上修改的是 /home 目錄的 inode。
因此,我們只需要在“容器進程“創建出來并且容器的 rootfs 準備好之后,但是在 chroot 之前,把 volume 指定的宿主機目錄掛載到指定的容器目錄在宿主機上對應的目錄即可(因為這時候容器進程可以一直看到宿主機上的整個文件系統,同時由于執行這個掛載操作的時候,容器已經創建出來了,那么此時 mount namespace 相當于已經開啟了,所以掛載事件只在容器里可見)。
★這邊的容器進程是 Docker 創建的一個容器初始化進程(dockerinit),而不是應用進程(ENTRYPOINT+CMD)。dockerinit 負責完成根目錄的準備、掛載設備和目錄、配置 hostname 等一系列需要在容器內進行的初始化操作。最后通過 execv() 系統調用,讓進程取代自己,成為容器里 PID=1 的進程。
”
由于 volume 掛載到指定的容器目錄在宿主機上對應的目錄位于可讀寫層,那么在 docker commit 的時候會被提交嘛?不會。這個主要是因為 docker commit 發生在宿主機空間,而這個 mount 發生在容器里面,并且這個 mount 由于 mount namespace 的隔離,不會影響到宿主機,也就是說宿主機上并沒有這個掛載。因此,在提交的時候只會提交一個空的目錄,因為 /test 是實實在在被新建在可讀寫層了的(這個新建可不受 mount namespace 的影響,因為 mount namespace 只影響 mount 相關的)。
下面我們來實驗一下,首先啟動一個容器并且讓這個容器使用一個 volume,掛載在容器里的 /test 目錄上。之后在容器的 /test 目錄中創建一個新的文件為 test.txt。
之后跑到卷所在的位置查看是否有相應的 test.txt 文件創建,結果顯示有 test.txt 文件創建。之后,我們再去可讀寫層對應的目錄查看是否有 test.txt 文件,結果顯示是有 test 目錄,但是沒有 test.txt 文件。因此,docker commit 的時候只會提交一個 test 空目錄。
# 創建名為 myvol 的卷。默認情況下,新卷創建使用 local 啟動,但是也可以使用 -d 指定不同的驅動
docker volumn create myvol
# 列出本地 Docker 主機上的全部卷
docker volumn ls
# 查看卷的詳細信息,可以通過這條命令查看卷在 Docker 主機文件系統中的具體位置
docker volumn inspect [VOLUMN_NAME]
# 刪除未裝入到某個容器或者服務的所有卷,不能刪除正在被容器或者服務使用的卷
docker volumn prune
# 刪除指定卷,不能刪除正在被容器或者服務使用的卷
docker volumn rm [VOLUMN_NAME]
# 創建了一個新的容器,并將容器內的 /vol 目錄掛載到了名為 bizvol 的卷。假如容器的文件系統中沒有 /vol 這個目錄,那么會創建;假如已有這個目錄,那么則會使用這個目錄(該目錄的內容到時候會變成卷里面的內容)。同理,系統中沒有叫 bizvol 的卷,那么該命令也會創建一個這樣的卷;如果已經存在這個卷了,那么則使用這個卷。
docker container run -it --name voltainer --mount source=bizvol,target=/vol alpine
# 沒有顯示聲明宿主機目錄,那么會在宿主機上創建一個臨時目錄 /var/lib/docker/volumn/[volume_name]/_data,然后把它掛載到容器 /test 目錄上。
docker run -v /test ...
# 把宿主機的 /home 目錄掛載到容器的 /test 目錄上
docker run -v /home:/test ...
到此,關于“如何使用Docker卷”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。