對于使用容器的用戶來說,容器如何存儲在磁盤上通常是一個謎。在這篇文章中,我們將了解容器鏡像的存儲方式以及可用于直接處理這些鏡像的一些工具 - Podman
容器鏡像存儲的演變
當我第一次開始使用容器時,我不喜歡 Docker 架構的一件事是守護進程隱藏了有關鏡像存儲的信息。人們使用鏡像的唯一現(xiàn)實方式是通過守護進程。我們正在開發(fā)該atomic工具,并希望有一種方法來掛載容器鏡像,以便我們可以掃描它們。畢竟,容器鏡像只是 devicemapper 或覆蓋層下的掛載點。
Red Hat 的容器運行時團隊創(chuàng)建了atomic mount在 Docker 下掛載鏡像的命令,并在atomic scan.這里的問題是守護進程不知道這一點,因此如果有人試圖在我們安裝鏡像時刪除鏡像,守護進程會感到困惑。鎖定和操作必須在守護進程內完成。
當我們開始創(chuàng)建新的容器引擎時,我們需要的第一件事就是構建一個新的容器/存儲庫,它不需要守護進程來控制它。我們希望允許多個工具同時使用存儲,而無需相互了解。
我們將使用文件系統(tǒng)鎖定來控制對存儲數(shù)據(jù)的訪問。第一步是分離出 Docker 項目下的容器/存儲,稱為 graphdriver。這些存儲驅動程序實現(xiàn)了不同的寫時復制(COW)存儲驅動程序,包括overlay、devicemapper、btrfs、xfs、vfs、aufs……如果你想在go項目中使用該庫,那么你只需實現(xiàn)一個存儲即可。
[請注意,容器/存儲庫與容器存儲接口(CSI)無關。容器/存儲是將容器鏡像存儲在COW文件系統(tǒng)上,而CSI則用于容器寫入的卷。例如,您可以使用 CSI 來存儲 MariaDB 容器鏡像使用的數(shù)據(jù)庫,該數(shù)據(jù)庫存儲在容器/存儲中。我希望這能消除任何困惑。
容器存儲配置在 storage.conf 文件中定義。對于以 root 身份運行的容器引擎,storage.conf 文件存儲在/etc/containers/storage.conf.如果您使用 Podman 等工具無根運行,則 storage.conf 文件存儲在$HOME/.config/containers/storage.conf.
現(xiàn)在我們來看一下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"
驅動領域至關重要。在容器/存儲中,我們默認使用overlay驅動程序。在 Docker 世界中,有兩個 Overlay 驅動程序,overlay 和 Overlay2,現(xiàn)在大多數(shù)用戶使用 Overlay2 驅動程序,所以我們只使用其中一個,并將其稱為 Overlay。如果您不小心在配置容器中使用了overlay2,存儲足夠智能,可以將其別名為overlay。
graphroot
# Temporary storage location runroot = "/var/run/containers/storage" # Primary Read/Write location of container storage graphroot = "/var/lib/containers/storage"
graphroot定義了實際鏡像的存儲位置。我們建議您在此位置設置大量空間,因為人們往往會隨著時間的推移存儲大量鏡像。設置存儲不需要特殊工具,您應該使用標準 Linux 命令以最適合您需求的任何方式設置存儲,但我們建議您在 /var/lib/containers 上掛載大型設備。
storage.options
[storage.options] # Storage options to be passed to underlying storage drivers
每個圖形驅動程序有很多存儲選項。其中一些允許您使用容器存儲做一些有趣的事情,我將在下面討論其中的一些。
additionalimagestores
# AdditionalImageStores is used to pass paths to additional Read/Only image stores # Must be comma separated list. additionalimagestores = [ ]
additionalimagestores是一項很酷的功能,它允許您設置附加的只讀鏡像存儲。例如,您可以設置包含許多覆蓋容器鏡像像的 NFS 共享,并通過 NFS 與所有容器引擎共享它們。然后,他們可以使用 NFS 存儲上的鏡像并啟動容器,而不是要求每個運行容器引擎的節(jié)點拉取巨大的鏡像。
size
# Size is used to set a maximum size of the container image. Only supported by # certain container storage drivers. size = ""
大小控制容器鏡像的大小,如果您運行的系統(tǒng)中有大量用戶將拉取鏡像,您可能需要設置配額以確保沒有用戶能夠拉取巨大的鏡像。例如,OpenShift.com使用此功能來控制其用戶,尤其是在使用OpenShift Online時。
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"
該標志允許您將特殊的安裝選項傳遞到驅動程序中。例如,設置該nodev字段可防止用戶使用容器鏡像中顯示的設備節(jié)點。容器引擎在安裝于 的 tmpfs 上提供設備/dev,因此沒有理由將設備嵌入到鏡像中,特別是當它們可用于規(guī)避安全性時。
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 標志告訴容器/存儲以重新映射的格式存儲鏡像,供指定用戶命名空間內的用戶使用。如果您設置remap-uidsto ,065536這會告訴容器存儲在存儲鏡像時重新映射UID=0to100,000, UID=1、to等(直到 uid )擁有的文件?,F(xiàn)在,如果容器引擎在映射內運行容器,它將使用與用戶而不是 root 關聯(lián)的 uid 更安全地運行。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
其余選項用于使用 devicemapper 等驅動程序以及其他一些選項創(chuàng)建 Thinpool。您可以參考/etc/containers/storage.conf磁盤上的文件以獲取說明,也可以參考 storage.conf(5) 手冊頁以獲取更多信息。
使用容器存儲
容器引擎和 Podman、Buildah、CRI-O、Skopeo 等工具同時共享容器存儲。他們都可以看到彼此的鏡像,并且可以基于文件鎖定彼此結合使用或完全單獨使用。這意味著 podman 可以安裝和檢查容器。雖然它們共享實際存儲,但它們不一定共享容器信息。有些工具具有不同的容器用例,并且不會顯示其他工具的容器。例如,buildah 只是為了構建容器鏡像的過程而創(chuàng)建構建容器,因為這些不需要 podman 容器的所有內容,所以它有一個單獨的數(shù)據(jù)庫。機器人工具可以刪除彼此的容器鏡像,但它們會單獨處理它們。
# 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 在啟動時預加載容器/存儲,以使容器/鏡像可供任何容器工具技術使用。請記住,沒有容器守護程序控制此訪問,只有標準文件系統(tǒng)工具。
審核編輯:黃飛
-
驅動程序
+關注
關注
19文章
818瀏覽量
47906 -
容器
+關注
關注
0文章
492瀏覽量
22028
原文標題:Podman中如何使用容器存儲庫和相關工具
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論