隨著容器和容器技術的興起,現在所有主流的 Linux 發行版都提供了容器基礎映象。本文介紹了 Fedora 專案如何構建其基本映象,同時還展示了如何使用它來建立分層影象。
在看如何構建 Fedora 容器基礎映象之前,讓我們定義基礎映象和分層映象。定義基礎映象的簡單方法是沒有父映象層的映象。但這具體意味著什麼呢?這意味著基礎映象通常只包含作業系統的根檔案系統基礎映象(rootfs)。基礎映象通常提供安裝軟體以建立分層映象所需的工具。
分層映象在基礎映象上新增了一組層,以便安裝、設定和執行應用。分層映象在 Dockerfile 中使用 FROM
指令參照基礎映象:
FROM fedora:latest
Fedora 有一整套用於構建容器映象的工具。,它不需要以 root 身份執行。
基礎映象主要由一個 tarball 構成。這個 tarball 包含一個 rootfs。有不同的方法來構建此 rootfs。Fedora 專案使用 kickstart 安裝方式以及 imagefactory 來建立這些 tarball。
在建立 Fedora 基礎映象期間使用的 kickstart 檔案可以在 Fedora 的構建系統 Koji 中找到。Fedora-Container-Base 包重新組合了所有基礎映象的構建版本。如果選擇了一個構建版本,那麼可以存取所有相關檔案,包括 kickstart 檔案。檢視 範例,檔案末尾的 %packages
部分定義了要安裝的所有軟體包。這就是讓軟體放在基礎映象中的方法。
rootfs 完成後,構建基礎映象就很容易了。它只需要一個包含以下指令的 Dockerfile:
FROM scratchADD layer.tar /CMD ["/bin/bash"]
這裡的重要部分是 FROM scratch
指令,它會建立一個空映象。然後,接下來的指令將 rootfs 新增到映象,並設定在執行映象時要執行的預設命令。
讓我們使用 Koji 內建的 Fedora rootfs 構建一個基礎映象:
$ curl -o fedora-rootfs.tar.xz https://kojipkgs.fedoraproject.org/packages/Fedora-Container-Base/Rawhide/20190902.n.0/images/Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz$ tar -xJvf fedora-rootfs.tar.xz 51c14619f9dfd8bf109ab021b3113ac598aec88870219ff457ba07bc29f5e6a2/layer.tar $ mv 51c14619f9dfd8bf109ab021b3113ac598aec88870219ff457ba07bc29f5e6a2/layer.tar layer.tar$ printf "FROM scratch\nADD layer.tar /\nCMD [\"/bin/bash\"]" > Dockerfile$ podman build -t my-fedora .$ podman run -it --rm my-fedora cat /etc/os-release
需要從下載的存檔中提取包含 rootfs 的 layer.tar
檔案。這在 Fedora 生成的映象已經可以被容器執行時使用才需要。
因此,使用 Fedora 生成的映象,獲得基礎映象會更容易。讓我們看看它是如何工作的:
$ curl -O https://kojipkgs.fedoraproject.org/packages/Fedora-Container-Base/Rawhide/20190902.n.0/images/Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz$ podman load --input Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz$ podman run -it --rm localhost/fedora-container-base-rawhide-20190902.n.0.x86_64:latest cat /etc/os-release
要構建使用 Fedora 基礎映象的分層映象,只需在 FROM
行指令中指定 fedora
:
FROM fedora:latest
latest
標記參照了最新的 Fedora 版本(編寫本文時是 Fedora 30)。但是可以使用映象的標籤來使用其他版本。例如,FROM fedora:31
將使用 Fedora 31 基礎映象。
Fedora 支援將軟體作為容器來構建並行布。這意味著你可以維護 Dockerfile 來使其他人可以使用你的軟體。關於在 Fedora 中成為容器映象維護者的更多資訊,請檢視 Fedora 容器指南。