使用Podman以非root用戶身份運(yùn)行Linux容器
Linux 容器是由 Linux 內(nèi)核所提供的具有特定隔離功能的進(jìn)程 —— 包括文件系統(tǒng)、進(jìn)程和網(wǎng)絡(luò)的隔離。容器有助于實(shí)現(xiàn)可移植性 —— 應(yīng)用可以在容器鏡像中與其依賴項(xiàng)一起分發(fā),并可在幾乎任何有容器運(yùn)行時(shí)環(huán)境的 Linux 系統(tǒng)上運(yùn)行。
雖然容器技術(shù)存在了很長(zhǎng)時(shí)間,但 Linux 容器是由 Docker 而得到了廣泛推廣。 “Docker” 這個(gè)詞可以指幾個(gè)不同的東西,包括容器技術(shù)和工具,周圍的社區(qū),或者 Docker Inc. 公司。但是,在本文中,我將用來(lái)指管理 Linux 容器的技術(shù)和工具。
什么是 Docker
Docker 是一個(gè)以 root 身份在你的系統(tǒng)上運(yùn)行的守護(hù)程序,它利用 Linux 內(nèi)核的功能來(lái)管理正在運(yùn)行的容器。除了運(yùn)行容器之外,它還可以輕松管理容器鏡像 —— 與容器注冊(cè)庫(kù)交互、存儲(chǔ)映像、管理容器版本等。它基本上支持運(yùn)行單個(gè)容器所需的所有操作。
但即使 Docker 是管理 Linux 容器的一個(gè)非常方便的工具,它也有兩個(gè)缺點(diǎn):它是一個(gè)需要在你的系統(tǒng)上運(yùn)行的守護(hù)進(jìn)程,并且需要以 root 權(quán)限運(yùn)行,這可能有一定的安全隱患。然而,Podman 在解決這兩個(gè)問(wèn)題。
Podman 介紹
Podman 是一個(gè)容器運(yùn)行時(shí)環(huán)境,提供與 Docker 非常相似的功能。正如已經(jīng)提示的那樣,它不需要在你的系統(tǒng)上運(yùn)行任何守護(hù)進(jìn)程,并且它也可以在沒有 root 權(quán)限的情況下運(yùn)行。讓我們看看使用 Podman 運(yùn)行 Linux 容器的一些示例。
使用 Podman 運(yùn)行容器
其中一個(gè)最簡(jiǎn)單的例子可能是運(yùn)行 Fedora 容器,在命令行中打印 “Hello world!”:
$ podman run --rm -it fedora:28 echo "Hello world!"
使用通用 Dockerfile 構(gòu)建鏡像的方式與 Docker 相同:
$ cat Dockerfile
FROM fedora:28
RUN dnf -y install cowsay
$ podman build . -t hello-world
... output omitted ...
$ podman run --rm -it hello-world cowsay "Hello!"
為了構(gòu)建容器,Podman 在后臺(tái)調(diào)用另一個(gè)名為 Buildah 的工具。你可以閱讀最近一篇關(guān)于使用 Buildah 構(gòu)建容器鏡像的文章 —— 它不僅僅是使用典型的 Dockerfile。
除了構(gòu)建和運(yùn)行容器外,Podman 還可以與容器托管進(jìn)行交互。要登錄容器注冊(cè)庫(kù),例如廣泛使用的 Docker Hub,請(qǐng)運(yùn)行:
$ podman login docker.io
為了推送我剛剛構(gòu)建的鏡像,我只需打上標(biāo)記來(lái)代表特定的容器注冊(cè)庫(kù),然后直接推送它。
$ podman -t hello-world docker.io/asamalik/hello-world
$ podman push docker.io/asamalik/hello-world
順便說(shuō)一下,你是否注意到我如何以非 root 用戶身份運(yùn)行所有內(nèi)容?此外,我的系統(tǒng)上沒有運(yùn)行又大又重的守護(hù)進(jìn)程!
安裝 Podman
Podman 默認(rèn)在 Silverblue 上提供 —— 一個(gè)基于容器的工作流的新一代 Linux 工作站。要在任何 Fedora 版本上安裝它,只需運(yùn)行:
$ sudo dnf install podman