對(duì)于使用容器的用戶來(lái)說(shuō),容器如何存儲(chǔ)在磁盤(pán)上通常是一個(gè)謎。在這篇文章中,我們將了解容器鏡像的存儲(chǔ)方式以及可用于直接處理這些鏡像的一些工具 - Podman
容器鏡像存儲(chǔ)的演變
當(dāng)我第一次開(kāi)始使用容器時(shí),我不喜歡 Docker 架構(gòu)的一件事是守護(hù)進(jìn)程隱藏了有關(guān)鏡像存儲(chǔ)的信息。人們使用鏡像的唯一現(xiàn)實(shí)方式是通過(guò)守護(hù)進(jìn)程。我們正在開(kāi)發(fā)該atomic工具,并希望有一種方法來(lái)掛載容器鏡像,以便我們可以掃描它們。畢竟,容器鏡像只是 devicemapper 或覆蓋層下的掛載點(diǎn)。
Red Hat 的容器運(yùn)行時(shí)團(tuán)隊(duì)創(chuàng)建了atomic mount在 Docker 下掛載鏡像的命令,并在atomic scan.這里的問(wèn)題是守護(hù)進(jìn)程不知道這一點(diǎn),因此如果有人試圖在我們安裝鏡像時(shí)刪除鏡像,守護(hù)進(jìn)程會(huì)感到困惑。鎖定和操作必須在守護(hù)進(jìn)程內(nèi)完成。
當(dāng)我們開(kāi)始創(chuàng)建新的容器引擎時(shí),我們需要的第一件事就是構(gòu)建一個(gè)新的容器/存儲(chǔ)庫(kù),它不需要守護(hù)進(jìn)程來(lái)控制它。我們希望允許多個(gè)工具同時(shí)使用存儲(chǔ),而無(wú)需相互了解。
我們將使用文件系統(tǒng)鎖定來(lái)控制對(duì)存儲(chǔ)數(shù)據(jù)的訪問(wèn)。第一步是分離出 Docker 項(xiàng)目下的容器/存儲(chǔ),稱為 graphdriver。這些存儲(chǔ)驅(qū)動(dòng)程序?qū)崿F(xiàn)了不同的寫(xiě)時(shí)復(fù)制(COW)存儲(chǔ)驅(qū)動(dòng)程序,包括overlay、devicemapper、btrfs、xfs、vfs、aufs……如果你想在go項(xiàng)目中使用該庫(kù),那么你只需實(shí)現(xiàn)一個(gè)存儲(chǔ)即可。
[請(qǐng)注意,容器/存儲(chǔ)庫(kù)與容器存儲(chǔ)接口(CSI)無(wú)關(guān)。容器/存儲(chǔ)是將容器鏡像存儲(chǔ)在COW文件系統(tǒng)上,而CSI則用于容器寫(xiě)入的卷。例如,您可以使用 CSI 來(lái)存儲(chǔ) MariaDB 容器鏡像使用的數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)存儲(chǔ)在容器/存儲(chǔ)中。我希望這能消除任何困惑。
容器存儲(chǔ)配置在 storage.conf 文件中定義。對(duì)于以 root 身份運(yùn)行的容器引擎,storage.conf 文件存儲(chǔ)在/etc/containers/storage.conf.如果您使用 Podman 等工具無(wú)根運(yùn)行,則 storage.conf 文件存儲(chǔ)在$HOME/.config/containers/storage.conf.
現(xiàn)在我們來(lái)看一下storage.conf。
driver
$ cat /etc/containers/storage.conf # This file is is the configuration file for all tools # that use the containers/storage library. # See man 5 containers-storage.conf for more information # The "container storage" table contains all of the server options. [storage] # Default Storage Driver driver = "overlay"
驅(qū)動(dòng)領(lǐng)域至關(guān)重要。在容器/存儲(chǔ)中,我們默認(rèn)使用overlay驅(qū)動(dòng)程序。在 Docker 世界中,有兩個(gè) Overlay 驅(qū)動(dòng)程序,overlay 和 Overlay2,現(xiàn)在大多數(shù)用戶使用 Overlay2 驅(qū)動(dòng)程序,所以我們只使用其中一個(gè),并將其稱為 Overlay。如果您不小心在配置容器中使用了overlay2,存儲(chǔ)足夠智能,可以將其別名為overlay。
graphroot
# Temporary storage location runroot = "/var/run/containers/storage" # Primary Read/Write location of container storage graphroot = "/var/lib/containers/storage"
graphroot定義了實(shí)際鏡像的存儲(chǔ)位置。我們建議您在此位置設(shè)置大量空間,因?yàn)槿藗兺鶗?huì)隨著時(shí)間的推移存儲(chǔ)大量鏡像。設(shè)置存儲(chǔ)不需要特殊工具,您應(yīng)該使用標(biāo)準(zhǔn) Linux 命令以最適合您需求的任何方式設(shè)置存儲(chǔ),但我們建議您在 /var/lib/containers 上掛載大型設(shè)備。
storage.options
[storage.options] # Storage options to be passed to underlying storage drivers
每個(gè)圖形驅(qū)動(dòng)程序有很多存儲(chǔ)選項(xiàng)。其中一些允許您使用容器存儲(chǔ)做一些有趣的事情,我將在下面討論其中的一些。
additionalimagestores
# AdditionalImageStores is used to pass paths to additional Read/Only image stores # Must be comma separated list. additionalimagestores = [ ]
additionalimagestores是一項(xiàng)很酷的功能,它允許您設(shè)置附加的只讀鏡像存儲(chǔ)。例如,您可以設(shè)置包含許多覆蓋容器鏡像像的 NFS 共享,并通過(guò) NFS 與所有容器引擎共享它們。然后,他們可以使用 NFS 存儲(chǔ)上的鏡像并啟動(dòng)容器,而不是要求每個(gè)運(yùn)行容器引擎的節(jié)點(diǎn)拉取巨大的鏡像。
size
# Size is used to set a maximum size of the container image. Only supported by # certain container storage drivers. size = ""
大小控制容器鏡像的大小,如果您運(yùn)行的系統(tǒng)中有大量用戶將拉取鏡像,您可能需要設(shè)置配額以確保沒(méi)有用戶能夠拉取巨大的鏡像。例如,OpenShift.com使用此功能來(lái)控制其用戶,尤其是在使用OpenShift Online時(shí)。
mounting
# Path to an helper program to use for mounting the file system instead of mounting it # directly. # mount_program = "/usr/bin/fuse-overlayfs" # mountopt specifies comma separated list of extra mount options mountopt = "nodev"
該標(biāo)志允許您將特殊的安裝選項(xiàng)傳遞到驅(qū)動(dòng)程序中。例如,設(shè)置該nodev字段可防止用戶使用容器鏡像中顯示的設(shè)備節(jié)點(diǎn)。容器引擎在安裝于 的 tmpfs 上提供設(shè)備/dev,因此沒(méi)有理由將設(shè)備嵌入到鏡像中,特別是當(dāng)它們可用于規(guī)避安全性時(shí)。
Remap-UIDs/GIDs
# Remap-UIDs/GIDs is the mapping from UIDs/GIDs as they should appear inside of # a container, to UIDs/GIDs as they should appear outside of the container, and # the length of the range of UIDs/GIDs. Additional mapped sets can be listed # and will be heeded by libraries, but there are limits to the number of # mappings which the kernel will allow when you later attempt to run a # container. # # remap-uids = 065536 # remap-gids = 065536
重新映射 uids 和 gids 標(biāo)志告訴容器/存儲(chǔ)以重新映射的格式存儲(chǔ)鏡像,供指定用戶命名空間內(nèi)的用戶使用。如果您設(shè)置remap-uidsto ,065536這會(huì)告訴容器存儲(chǔ)在存儲(chǔ)鏡像時(shí)重新映射UID=0to100,000, UID=1、to等(直到 uid )擁有的文件。現(xiàn)在,如果容器引擎在映射內(nèi)運(yùn)行容器,它將使用與用戶而不是 root 關(guān)聯(lián)的 uid 更安全地運(yùn)行。100,001``UID=2``100,0002``65536
# Remap-User/Group is a name which can be used to look up one or more UID/GID # ranges in the /etc/subuid or /etc/subgid file. Mappings are set up starting # with an in-container ID of 0 and the a host-level ID taken from the lowest # range that matches the specified name, and using the length of that range. # Additional ranges are then assigned, using the ranges which specify the # lowest host-level IDs first, to the lowest not-yet-mapped container-level ID, # until all of the entries have been used for maps. # # remap-user = "storage" # remap-group = "storage" [storage.options.thinpool] # Storage Options for thinpool
Others
其余選項(xiàng)用于使用 devicemapper 等驅(qū)動(dòng)程序以及其他一些選項(xiàng)創(chuàng)建 Thinpool。您可以參考/etc/containers/storage.conf磁盤(pán)上的文件以獲取說(shuō)明,也可以參考 storage.conf(5) 手冊(cè)頁(yè)以獲取更多信息。
使用容器存儲(chǔ)
容器引擎和 Podman、Buildah、CRI-O、Skopeo 等工具同時(shí)共享容器存儲(chǔ)。他們都可以看到彼此的鏡像,并且可以基于文件鎖定彼此結(jié)合使用或完全單獨(dú)使用。這意味著 podman 可以安裝和檢查容器。雖然它們共享實(shí)際存儲(chǔ),但它們不一定共享容器信息。有些工具具有不同的容器用例,并且不會(huì)顯示其他工具的容器。例如,buildah 只是為了構(gòu)建容器鏡像的過(guò)程而創(chuàng)建構(gòu)建容器,因?yàn)檫@些不需要 podman 容器的所有內(nèi)容,所以它有一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)。機(jī)器人工具可以刪除彼此的容器鏡像,但它們會(huì)單獨(dú)處理它們。
# podman create -ti --name fedora-ctr fedora sh ed4b68304e9fbbbc527593c28c917535e1d67d7d5c3f25edc568b71275ab69fc sh-4.4# podman mount fedora-ctr /var/lib/containers/storage/overlay/b16991596db22b90b78ef10276e2ae73a1c2ca9605014cad95aac00bff6608bc/merged # ls /var/lib/containers/storage/overlay/b16991596db22b90b78ef10276e2ae73a1c2ca9605014cad95aac00bff6608bc/merged binbootdevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar
雖然 buildah 和 CRI-O 可以使用相同的 Fedora 鏡像
您甚至可以使用 Skopeo 在啟動(dòng)時(shí)預(yù)加載容器/存儲(chǔ),以使容器/鏡像可供任何容器工具技術(shù)使用。請(qǐng)記住,沒(méi)有容器守護(hù)程序控制此訪問(wèn),只有標(biāo)準(zhǔn)文件系統(tǒng)工具。
審核編輯:黃飛
-
驅(qū)動(dòng)程序
+關(guān)注
關(guān)注
19文章
836瀏覽量
48038 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22061
原文標(biāo)題:Podman中如何使用容器存儲(chǔ)庫(kù)和相關(guān)工具
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論