什么是Podman
Podman(POD Manager)是一個開源的無守護進程(daemonless)容器引擎,用于管理容器、容器鏡像、容器卷和網絡。
它兼容 OCI 標準,可以運行 Docker 鏡像,并且設計上與 Docker CLI 命令高度兼容。
Podman 的特點與優勢
- Daemonless進程,更輕
Podman 直接使用 RunC(或其他符合 OCI 的運行時)來創建和運行容器。每個容器都是當前用戶的一個子進程。
基于 Daemonless 能夠提供更安全(減少攻擊面)、更穩定(守護進程崩潰不影響現有容器)、資源消耗更低、更符合 Linux 進程模型。
對比 Docker,依賴于一個長期運行的后臺進程 (dockerd) 來管理容器。
- Rootless容器,更安全
普通用戶無需 sudo 或 root 權限即可直接啟動和管理容器。
極大提升安全性(容器進程以用戶權限運行,即使容器被攻破,影響范圍也限于該用戶)、滿足更嚴格的安全合規要求、允許多用戶在同一系統上安全地管理各自的容器。
對比 Docker,目前也支持 Rootless 容器,但需要進行特殊配置,且默認任然需要 root 權限。
- 基于標準設計,兼容好
Podman 支持 OCI 標準,且與 Docker 兼容,大部分命令與 Docker 命令相同。
Docker 用戶遷移成本小,學習曲線低,現有腳本通常只需替換命令即可工作。
- Kubernetes Pod 原生支持:
Podman 對 Kubernetes 的 Pod 概念有原生支持。可以輕松創建和管理包含多個共享命名空間(網絡、IPC、UTS)容器的 Pod。
可以在創建、啟動、檢查和管理Pod。直接使用Podman操作Kubernetes YAML,從Pod生成Kubernetes YAML,并部署到現有的Kubernetes環境中。
Podman 安裝
- 在 Window和 MacOS 上安裝 Podman
容器是基于 Linux 內核的,因此和 Docker 一樣,在 Window 和 MacOS 上運行容器時需要用到虛擬機。
和 Docker Machine 一樣,Podman 也有 Podman Machine 虛擬機。
如在 MacOS 上安裝 Podman
brew?install?podman
podman?info
podman?machine?init
podman?machine?start
podman?machine?ls
podman?run?hello-world
在 Windows上,每臺 Podman 機器都由一個虛擬化的Windows Subsystem for Linux(WSLv2)發行版提供支持。
安裝后,可以直接從 Windows PowerShell(或CMD)提示符運行podman命令,該命令會與在WSL環境中運行的podman服務進行遠程通信。
或者,如果您更喜歡Linux提示符和Linux工具,也可以直接從WSL實例訪問Podman。
除了直接使用 podman 外,Podman Desktop 也可以作為圖形界面工具,
- 在 Linux 上安裝 Podman
在 Linux 上安裝 Podman 的最簡單方法是使用包管理器。
#?Arch?Linux?&?Manjaro?Linux
sudo?pacman?-S?podman#?Alpine?Linux
sudo?apk?add?podman#?CentOS?Stream/Fedora
sudo?dnf?-y?install?podman#?Debian/Ubuntu
sudo?apt-get?-y?install?podman#?Gentoo
sudo?emerge?app-containers/podman#?openSUSE
sudo?zypper?install?podman
Podman 使用
podman 命令和 docker 命令基本一樣,設置一個簡單的別名?alias docker=podman
?就能無縫切換。
- 查找鏡像
Podman會在不同的鏡像倉庫中搜索。
podman?search?httpd?--filter=is-official
- 拉取鏡像
建議使用完整的鏡像名稱(如docker.io/library/httpd,而不是httpd),以確保您使用的是正確的鏡像。
podman?pull?docker.io/library/httpd
- 運行一個容器
示例容器將運行一個基礎的httpd服務器
podman?run?-dt?-p?8080:80/tcp?docker.io/library/httpd
容器是在分離模式-d
下運行的,Podman將在執行命令后打印出容器ID。-t
?選項還會添加一個偽終端,以便在交互式shell中運行任意命令。-p
?添加一個端口映射,將 httpd 的 80 端口映射到主機的8080端口。
- 查看容器狀態
podman ps
命令用于列出已創建和正在運行的容器。
podman?ps
如果添加?-a
?參數,Podman 將顯示所有容器,包括已創建、已退出、正在運行等。
- 測試httpd服務
通過端口映射,httpd 服務的 80 端口映射到宿主機的 8080 端口。
curl?http://localhost:8080
- 其他命令
其他如?podman logs
?、podman inspect
、?podman stop
、podman rm
?、podman images
?和 docker 的命令一致,可以查看詳細的 podman 或 docker 的命令行文檔。
Podman和Docker生態對比
對比項目 | Docker | Podman |
Daemonless | dockerd | 無 |
Rootless | 需要特殊配置 | 默認rootless |
Machine | Docker Machine | Podman Machine |
Compose | Docker Compose | Podman Compose |
Desktop | Docker Desktop | Podman Desktop |
Dockerfile | Dockerfile | Containerfile |
Podman 和 Docker 該如何選?
如果對安全是否有更高的要求,推薦 Podman
- Podman 是開源的,由CNCF社區托管。避免了單一廠商的鎖定。
- Podman 默認是 Rootless。業務邏輯運行在容器內,避免了越權問題。
- Podman 默認不運行后臺進程。減少容器運行時消耗的資源,以及安全攻擊面。
如果對產品成熟度和生態完善性有更高的要求,推薦 Docker
- 當前很多DevOps工具默認集成了 Docker。如 Jenkines、ArgoCD等
- Podman 還處于 CNCF 的沙盒階段,距離孵化和畢業還需要很長一段時間。
- Podman 功能上大部分兼容 Docker,但任然有一些功能還未完全兼容,如不支持 Docker 的?
--restart=always
(依賴守護進程實現容器自啟),Podman 需通過 Systemd 單元文件管理。