無(wú)需sudo使用Podman在Linux上運(yùn)行容器
配置你的系統(tǒng)使用無(wú)根容器。
容器是現(xiàn)代計(jì)算的一個(gè)重要組成部分,隨著圍繞容器的基礎(chǔ)設(shè)施的發(fā)展,新的和更好的工具開(kāi)始浮出水面。過(guò)去,你只需用 ??LXC??? 就可以運(yùn)行容器,然而隨著 Docker 得到了普及,它開(kāi)始變得越來(lái)越復(fù)雜。最終,我們?cè)?nbsp;??Podman?? 得到了我們所期望的容器管理系統(tǒng):一個(gè)無(wú)守護(hù)進(jìn)程的容器引擎,它使容器和吊艙易于構(gòu)建、運(yùn)行和管理。
容器直接與 Linux 內(nèi)核能力(如控制組和命名空間)交互,它們?cè)谶@些命名空間中產(chǎn)生大量的新進(jìn)程。簡(jiǎn)而言之,運(yùn)行一個(gè)容器實(shí)際上就是在
Linux 系統(tǒng)內(nèi)部運(yùn)行一個(gè) Linux
系統(tǒng)。從操作系統(tǒng)的角度來(lái)看,它看起來(lái)非常像一種管理和特權(quán)活動(dòng)。普通用戶(hù)通常不能像容器那樣自由支配系統(tǒng)資源,所以默認(rèn)情況下,運(yùn)行 Podman
需要 root 或 ??sudo?
?? 權(quán)限。然而,這只是默認(rèn)設(shè)置,而且這絕不是唯一可用的設(shè)置。本文演示了如何配置你的 Linux 系統(tǒng),使普通用戶(hù)可以在不使用 ??sudo?
? 的情況下(“無(wú)根rootless”)運(yùn)行 Podman。
命名空間的用戶(hù) ID
??內(nèi)核命名空間?? 本質(zhì)上是一種虛構(gòu)的結(jié)構(gòu),可幫助 Linux 跟蹤哪些進(jìn)程屬于同一類(lèi)。這是 Linux 中的“隊(duì)列護(hù)欄”。一個(gè)隊(duì)列中的進(jìn)程與另一個(gè)隊(duì)列中的進(jìn)程之間實(shí)際上沒(méi)有區(qū)別,但可以將它們用“警戒線(xiàn)”彼此隔離。要聲明一組進(jìn)程為“容器”,而另一組進(jìn)程為你的操作系統(tǒng),將它們分開(kāi)是關(guān)鍵。
Linux 通過(guò)用戶(hù) ID(UID)和組 ID(GID)來(lái)跟蹤哪個(gè)用戶(hù)或組擁有的進(jìn)程。通常情況下,一個(gè)用戶(hù)可以訪(fǎng)問(wèn)一千個(gè)左右的從屬 UID,以分配給命名空間的子進(jìn)程。由于 Podman 運(yùn)行的是分配給啟動(dòng)容器的用戶(hù)的整個(gè)從屬操作系統(tǒng),因此你需要的不僅僅是默認(rèn)分配的從屬 UID 和從屬 GID。
你可以用 ??usermod?
?? 命令授予一個(gè)用戶(hù)更多的從屬 UID 和從屬 GID。例如,要授予用戶(hù) ??tux?
? 更多的從屬 UID 和從屬 GID,選擇一個(gè)還沒(méi)分配用戶(hù)的適當(dāng)?shù)母?UID(如 200000),然后將其增加幾千:
$ sudo usermod \
--add-subuids 200000-265536 \
--add-subgids 200000-265536 \
tux
命名空間訪(fǎng)問(wèn)
對(duì)命名空間數(shù)量也有限制。這通常被設(shè)置得很高。你可以用 ??systctl?
?,即內(nèi)核參數(shù)工具來(lái)驗(yàn)證用戶(hù)的命名空間分配:
$ sysctl --all --pattern user_namespaces
user.max_user_namespaces = 28633
這是很充足的命名空間,而且可能是你的發(fā)行版默認(rèn)設(shè)置的。如果你的發(fā)行版沒(méi)有這個(gè)屬性或者設(shè)置得很低,那么你可以在文件 ??/etc/sysctl.d/userns.conf?
? 中輸入這樣的文本來(lái)創(chuàng)建它:
user.max_user_namespaces=28633
加載該設(shè)置:
$ sudo sysctl -p /etc/sysctl.d/userns.conf
在沒(méi)有 root 權(quán)限的情況下運(yùn)行一個(gè)容器
當(dāng)你設(shè)置好你的配置,重啟你的計(jì)算機(jī),以確保你的用戶(hù)和內(nèi)核參數(shù)的變化被加載和激活。
重啟后,試著運(yùn)行一個(gè)容器鏡像:
$ podman run -it busybox echo "hello"
hello
容器像命令一樣
如果你是第一次接觸容器,可能會(huì)覺(jué)得很神秘,但實(shí)際上,它們與你現(xiàn)有的 Linux 系統(tǒng)沒(méi)有什么不同。它們實(shí)際上是在你的系統(tǒng)上運(yùn)行的進(jìn)程,沒(méi)有仿真環(huán)境或虛擬機(jī)的成本和障礙。容器和你的操作系統(tǒng)之間的區(qū)別只是內(nèi)核命名空間,所以它們實(shí)際上只是帶有不同標(biāo)簽的本地進(jìn)程。Podman 使這一點(diǎn)比以往更加明顯,當(dāng)你將 Podman 配置為無(wú)根命令,容器感覺(jué)更像命令而不是虛擬環(huán)境。Podman 使容器和吊艙變得簡(jiǎn)單,所以請(qǐng)?jiān)囈辉嚒?/p>