跳到主要内容

Podman 安装说明

正在寻找 GUI? 您可以在此处找到 Podman 桌面版。

在 Mac 和 Windows 上安装

虽然“容器是 Linux”,但 Podman 也可以在 Mac 和 Windows 上运行,其中它 提供原生 podman CLI 并嵌入来宾 Linux 系统来启动您的 容器。 该来宾称为 Podman 机器,并通过以下方式进行管理 “podman machine”命令。 Mac 和 Windows 上的 Podman 还会监听 Docker API客户端,支持直接使用基于Docker的工具和 从您选择的语言进行编程访问。

苹果系统

在 Mac 上,每台 Podman 机器都由虚拟机支持。 安装后,可以直接运行 podman 命令 Terminal 中的 Unix shell,它与 podman 进行远程通信 在机器虚拟机中运行的服务。

下载 Podman 安装 (推荐)

Podman 可以从 Podman.io 网站下载。

我们还在我们的 Github 发布页面 上上传安装程序和其他二进制文件。

虽然不推荐,但 Podman 也可以通过 Homebrew 获得,包管理器。

通过 Brew 安装

由于 Brew 是社区维护的包管理器,因此我们无法保证稳定性 Podman 的 Brew 安装量。 因此,不建议通过 Brew 安装。

但是,如果您确实希望使用 Brew,则必须首先安装 Homebrew。 一旦您 已经设置好了brew,你可以使用brew install命令来安装Podman:

brew install podman

安装后,您需要创建并启动您的第一台 Podman 机器:

podman machine init
podman machine start

然后您可以使用以下方法验证安装信息:

podman info

我们还在 Github 发布页面 上提供二进制文件和 pkginstaller

Windows

在 Windows 上,每台 Podman 机器均由虚拟化 Windows 子系统支持 Linux (WSLv2) 发行版。 安装完成后,可以运行podman命令 直接从 Windows PowerShell(或 CMD)提示符处远程操作 与 WSL 环境中运行的 podman 服务通信。 或者,您可以直接从 WSL 实例访问 Podman,如果您 更喜欢 Linux 提示符和 Linux 工具。

请参阅 Podman for Windows 指南 了解设置和使用说明。

在 Linux 上安装

推荐安装使用Cockpit管理面板来管理和运行podman Cockpit 指南了解设置和使用说明

Linux 发行版

Arch Linux & Manjaro Linux

sudo pacman -S podman

如果您在 rootless 模式下运行 Podman 时遇到问题,请按照此处有关 ArchLinux 上 Podman 的更多信息 单击此处

Alpine Linux

sudo apk add podman

欲了解更多详细信息,请参阅Alpine Linux wiki上的说明。

CentOS

Podman 在 CentOS 7 的默认 Extras 存储库中可用 适用于 CentOS 8 和 Stream 的 AppStream 存储库。

sudo yum -y install podman

Debian

podman 软件包在 Debian 11 (Bullseye) 存储库及更高版本中可用。

sudo apt-get -y install podman

Fedora

sudo dnf -y install podman

Fedora CoreOS, Fedora Silverblue

内置,无需安装

Gentoo

sudo emerge app-containers/podman

OpenEmbedded

Podman 及其依赖项的 Bitbake 配方可以在meta-virtualization layer中找到.请将该层添加到您的 OpenEmbedded 构建环境中,并使用以下命令构建 Podman:

bitbake podman

openSUSE

sudo zypper install podman

openSUSE Kubic

内置,无需安装

Raspberry Pi OS arm64 (beta)

Raspberry Pi OS 使用标准 Debian 存储库,因此它与 Debian 的 arm64 存储库完全兼容。您只需按照Debian 的步骤 安装 Podman 即可。

RHEL7

订阅,然后启用 Extras 频道并安装 Podman。

sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
sudo yum -y install podman

RHEL8

Podman 与 Buildah 和 Skopeo 一起包含在container-tools 模块中。

sudo yum module enable -y container-tools:rhel8
sudo yum module install -y container-tools:rhel8

container-tools:rhel8 是快速应用程序流,包含工具的最新滚动版本。 使用“container-tools:2.0”流获取 Podman 1.6 的稳定版本。 命令 yum module list container-tools 显示可用的流。

Ubuntu

podman 软件包可在 Ubuntu 20.10 的官方存储库中找到和更新的。

# Ubuntu 20.10 and newer
sudo apt-get update
sudo apt-get -y install podman

Linux Mint

按照 Ubuntu(或 Debian,如果您使用 LMDE)的步骤进行操作。

对于 Ubuntu 步骤,将 $(lsb_release -rs)替换为 $(grep DISTRIB_RELEASE= /etc/upstream-release/lsb-release | cut -d "=" -f 2)

安装 Podman 的开发版本

Fedora

你可以在 Fedora 的updates-testing中测试最新的 Podman存储库,然后再发布给所有 Fedora 用户

sudo dnf update --refresh --enablerepo=updates-testing podman

如果您使用 Fedora 的 updates-testing中较新的 Podman 包,我们非常欢迎您在Bodhi、Fedora 的更新管理中给予+1的反馈.

安装 Podman 的前沿版本

如果您喜欢冒险并有兴趣在 Fedora、CentOS 和 RHEL 上测试 Podman 的最新未发布版本,我们有一个 Copr 仓库 可供使用。.

警告:

此仓库包含使用上游容器工具仓库的 main 分支生成的 rpm 构建,因此绝对不建议用于任何生产环境。RHEL8 / CentOS 8 Stream 用户首先需要禁用 container-tools 模块。其他所有用户可以跳过此步骤。

sudo dnf module disable container-tools -y

启用 Copr 并安装 podman。

sudo dnf copr enable rhcontainerbot/podman-next -y
sudo dnf install podman

FreeBSD 14.0 上安装

警告:

Podman 容器引擎的 FreeBSD 端口是实验性的,只能用于评估和测试目的。

您可以使用pkg命令在 FreeBSD 上安装 Podman :

pkg install podman

还有一个名为 podman-suite 的元包,它会为您拉取其他软件包(如 buildah、skopeo)。

初始配置

为了正确支持 Podman 的容器重启策略,conmon 需要将 fdescfs(5) 挂载到 /dev/fd

如果 /dev/fd 尚未挂载:

mount -t fdescfs fdesc /dev/fd

要使其永久生效,请将以下行添加到/etc/fstab中:

fdesc   /dev/fd         fdescfs         rw      0       0

重新启动后启动 Podman:

service podman enable

联网

容器网络依赖 NAT 来允许容器网络数据包发送到主机网络。 这需要 PF 防火墙来执行转换。 包含一个简单的示例 - 使用它:

cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf

编辑 /etc/pf.conf 并将 v4egress_ifv6egress_if 变量设置为您的网络接口

启用并启动pf

service pf enable
service pf start

示例 PF 配置包括对端口重定向的支持。 这些是作为嵌套在 cni-rdr 下的锚点中的重定向规则实现的。

FreeBSD 13.3 及更高版本支持将连接从容器主机重定向到容器内运行的服务。 要启用此功能,首先加载 pf 内核模块并使用 sysctl 启用 PF 对这些重定向的支持:

echo 'pf_load="YES"' >> /boot/loader.conf
kldload pf
sysctl net.pf.filter_local=1
echo 'net.pf.filter_local=1' >> /etc/sysctl.conf.local
service pf restart

如果目标地址是本地主机(例如 127.0.0.1 或 ::1),重定向规则将起作用 - 要启用此功能,以下行必须包含在您的/etc/pf.conf中:

nat-anchor "cni-rdr/*"

如果从旧版本升级,则需要将其添加到/etc/pf.conf中。例如,如果主机端口 1234 被重定向在容器,您可以使用以下方式连接到它:

fetch -o- http://$(hostname):1234

fetch -o- http://localhost:1234

存储

容器映像和相关状态存储在/var/db/containers中。 为此建议使用 ZFS:

zfs create -o mountpoint=/var/db/containers zroot/containers

如果您的系统无法使用 ZFS,请更改 storage.conf 以使用 vfs 存储驱动程序:

sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf

确认

执行以下步骤后,您应该能够运行本机映像:

podman run --rm docker.io/dougrabson/hello

Linux 模拟

可以使用 FreeBSD 的 Linux 模拟来运行许多 Linux 容器映像:

sudo sysrc linux_enable=YES
sudo service linux start
sudo podman run --rm --os=linux alpine cat /etc/os-release | head -1
NAME="Alpine Linux"

从源代码构建

构建并运行依赖项

必需的

在Fedora:

# 安装构建依赖项
sudo dnf -y builddep rpm/podman.spec

# 安装运行时依赖项
sudo dnf -y install catatonit conmon containers-common-extra

在所有 RHEL 和 CentOS 系统上,首先安装 dnf-builddep:

sudo dnf -y install 'dnf-command(builddep)'

安装构建依赖:

# CentOS Stream 8
sudo dnf -y builddep rpm/podman.spec --enablerepo=powertools

# CentOS Stream 9
sudo dnf -y builddep rpm/podman.spec --enablerepo=crb

# RHEL (8及更高版本)
sudo dnf -y builddep rpm/podman.spec --enablerepo=codeready-builder-for-rhel-$(rpm --eval %{?rhel})-$(uname -m)-rpms

安装运行时依赖:

sudo dnf -y install \
conmon \
containers-common \
crun \
iptables \
netavark \
nftables \
slirp4netns

Debian、Ubuntu及相关发行版:

sudo apt-get install \
btrfs-progs \
crun \
git \
golang-go \
go-md2man \
iptables \
libassuan-dev \
libbtrfs-dev \
libc6-dev \
libdevmapper-dev \
libglib2.0-dev \
libgpgme-dev \
libgpg-error-dev \
libprotobuf-dev \
libprotobuf-c-dev \
libseccomp-dev \
libselinux1-dev \
libsystemd-dev \
netavark \
pkg-config \
uidmap

请注意,较旧的Debian/Ubuntu版本可能不包含netavark包。在这种情况下,请安装containernetworking-plugins包作为替代。

在openSUSE Leap 15.x和Tumbleweed上:

sudo zypper -n in libseccomp-devel libgpgme-devel

在Manjaro(以及其他可能的Linux发行版)上:

请确保Linux内核支持用户命名空间:

> zgrep CONFIG_USER_NS /proc/config.gz
CONFIG_USER_NS=y

如果没有,请更新内核。Manjaro Linux的说明可以在这里找到:manjaro之后,启用用户命名空间:

sudo sysctl kernel.unprivileged_userns_clone=1

为了永久启用用户命名空间:

echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf

构建缺失的依赖

如果任何依赖项无法安装或版本不够新,则必须从源代码构建它们。这主要影响Debian、Ubuntu及相关发行版,或者在未激活订阅的RHEL上(例如云虚拟机)。

Golang

请务必仔细检查golang的版本是否足够新(即使用go version命令检查),截至2022年1月,需要1.16.x或更高版本。当前的最低要求版本可以在go.mod文件中找到。如果需要,可以在golang获取golang安装包。另外,也可以按照以下步骤从源代码编译安装golang:(保留系统安装的go版本是有帮助的,以避免需要从源代码编译安装go):

export GOPATH=~/go
git clone https://go.googlesource.com/go $GOPATH
cd $GOPATH
cd src
./all.bash
export PATH=$GOPATH/bin:$PATH

conmon

系统应安装最新版本的conmon。Conmon用于监控OCI运行时。若要从源代码编译安装,请使用以下命令:

git clone https://github.com/containers/conmon
cd conmon
export GOCACHE="$(mktemp -d)"
make
sudo make install

crun / runc

系统应至少安装一个最新版本的容器运行时。crunrunc是其中的一些选择,Podman会根据默认设置(crun优先级高于runc)选择其中一个作为默认运行时。例如,Ubuntu 22.04提供了crunrunc的支持版本。runc版本1.0.0-rc4是最低要求,自Ubuntu 18.04起可用。为了再次确认,runc --version应该至少显示spec: 1.0.1,否则请自行编译:

git clone https://github.com/opencontainers/runc.git $GOPATH/src/github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make BUILDTAGS="selinux seccomp"
sudo cp runc /usr/bin/runc

CNI插件

配置CNI网络

关于如何配置CNI网络的详细说明可以在cni的README文件中找到。

添加配置

sudo mkdir -p /etc/containers
sudo curl -L -o /etc/containers/registries.conf https://src.fedoraproject.org/rpms/containers-common/raw/main/f/registries.conf
sudo curl -L -o /etc/containers/policy.json https://src.fedoraproject.org/rpms/containers-common/raw/main/f/default-policy.json

可选包

Fedora、CentOS、RHEL及其相关发行版:

(没有可选包)

Debian、Ubuntu及其相关发行版:

apt-get install -y \
libapparmor-dev

获取源代码

首先,确保在$PATH中找到的第一个go version是1.16.x或更高版本。如果需要,上面的golang部分将指导您编译更新版本的Go。然后我们可以构建Podman:

git clone https://github.com/containers/podman/
cd podman
make BUILDTAGS="selinux seccomp" PREFIX=/usr
sudo make install PREFIX=/usr

构建标签

否则,如果您不想使用seccomp或selinux支持构建Podman,可以在运行make时添加BUILDTAGS=""

make BUILDTAGS=""
sudo make install

Podman支持可选的构建标签,用于编译对各种功能的支持。 要将构建标签添加到make选项中,必须设置BUILDTAGS变量,例如:

make BUILDTAGS='seccomp apparmor'
构建标签功能依赖项
apparmorapparmor支持libapparmor
exclude_graphdriver_btrfs排除btrfslibbtrfs
exclude_graphdriver_devicemapper排除device-mapperlibdm
libdm_no_deferred_remove在libdm中排除延迟删除libdm
seccomp系统调用过滤libseccomp
selinuxselinux进程和挂载标签
systemdjournald日志记录libsystemd

请注意,Podman官方不支持device-mapper。因此,exclude_graphdriver_devicemapper标签是必需的。

供应商管理 - 依赖管理

本项目使用go modules进行依赖管理。如果持续集成(CI)对某个拉取请求(pull request)留下不干净的状态表示不满,那么它很可能是正确的。在更改依赖项后,请确保运行make vendor来同步代码与go模块,并重新填充./vendor目录。

Ansible

还有一个Ansible Role,可用于在其支持的操作系统上自动化安装上述静态链接的二进制文件:

sudo su -
mkdir -p ~/.ansible/roles
cd ~/.ansible/roles
git clone https://github.com/alvistack/ansible-role-podman.git podman
cd ~/.ansible/roles/podman
pip3 install --upgrade --ignore-installed --requirement requirements.txt
molecule converge
molecule verify

配置文件

registries.conf

手册页:registries.conf.5

/etc/containers/registries.conf``registries.conf是一个配置文件,用于指定在补全不包含注册表或域名部分的镜像名称时应该咨询哪些容器注册表。

Fedora containers-common包中的示例

$ cat /etc/containers/registries.conf
# 有关此配置文件的更多信息,请参见containers-registries.conf(5)。
#
# 注意:使用非限定性镜像名称的风险
我们推荐使用包含注册表服务器(完整的DNS名称)、命名空间、镜像名称和标签(例如,registry.redhat.io/ubi8/ubi:latest)的完全限定镜像名称。通过摘要(例如,quay.io/repository/name@digest)拉取镜像可进一步消除标签的歧义。使用简称时,始终存在被欺骗的风险。例如,用户想要从注册表中拉取名为“foobar”的镜像,并期望它来自myregistry.com。如果myregistry.com不是搜索列表中的第一个,攻击者可以在搜索列表中较早的注册表中放置一个不同的“foobar”镜像。用户会意外地拉取并运行攻击者的镜像和代码,而不是预期的内容。我们建议仅添加完全受信任的注册表(即不允许未知或匿名用户创建具有任意名称的帐户的注册表)。这将防止镜像被欺骗、占用或以其他方式变得不安全。如果必须使用这些注册表之一,应将其添加到列表的末尾。

#
# 这是一个尝试拉取非限定镜像时要按顺序尝试的主机[:端口]注册表的数组。
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "docker.io"]
#
# [[registry]]
# # "prefix"字段用于选择相关的[[registry]] TOML表;
# # (仅)输入镜像名称(考虑到命名空间/仓库/标签/摘要分隔符)的最长匹配的TOML表将被使用。
# #
# # 如果缺少prefix字段,则默认为与“location”字段相同。
# prefix = "example.com/foo"
#
# # 如果为true,则允许使用未加密的HTTP以及带有不受信任证书的TLS连接。
# insecure = false
#
# # 如果为true,则禁止拉取名为匹配的镜像。
# blocked = false
#
# “prefix”所指定的命名空间的物理位置。
# #
# # 默认情况下,这与“prefix”相等(在这种情况下可以省略“prefix”,并且[[registry]] TOML表只能指定“location”)。
# #
# # 示例:给定
# # prefix = "example.com/foo"
# # location = "internal-registry-for-example.net/bar"
# # 对于镜像example.com/foo/myimage:latest的请求,实际上将使用internal-registry-for-example.net/bar/myimage:latest镜像。
# location = "internal-registry-for-example.com/bar"
#
# # “prefix”所指定的命名空间的(可能部分的)镜像。
# #
# # 镜像将按照指定的顺序进行尝试;第一个可以联系且包含镜像的将被使用(如果所有镜像都不包含该镜像,最后会尝试由“registry.location”字段或未修改的用户指定引用指定的主要位置)。
# #
# # “mirror”数组中的每个TOML表可以包含以下字段,具有与直接在[[registry]] TOML表中指定时相同的语义:
# # - location
# # - insecure
# [[registry.mirror]]
# location = "example-mirror-0.local/mirror-for-foo"
# [[registry.mirror]]
# location = "example-mirror-1.local/mirrors/foo"
# insecure = true
# # 根据上述配置,对example.com/foo/image:latest的拉取将按顺序尝试:
# # 1. example-mirror-0.local/mirror-for-foo/image:latest
# # 2. example-mirror-1.local/mirrors/foo/image:latest
# # 3. internal-registry-for-example.net/bar/image:latest
# # 并使用第一个存在的镜像。
#
# short-name-mode="enforcing" # 强制使用短名称模式。

[[registry]]
location="localhost:5000"
insecure=true

mounts.conf

/usr/share/containers/mounts.conf 和可选的 /etc/containers/mounts.conf

mounts.conf 文件指定了在执行 podman runpodman build 命令时自动挂载到容器内部的卷挂载目录。容器进程随后可以使用这些内容。卷挂载的内容不会被提交到最终镜像中。

通常,这些目录用于传递软件包软件访问远程软件包仓库所需的密钥或凭据。

例如,一个包含 "/usr/share/rhel/secrets:/run/secrets" 行的 mounts.conf 文件会将 /usr/share/rhel/secrets 目录的内容挂载到容器内的 /run/secrets。这个挂载点允许容器使用主机上的 Red Hat Enterprise Linux 订阅。

请注意,这不是一个卷挂载。卷的内容被复制到容器存储中,而不是直接从主机进行绑定挂载。

Fedora containers-common 包中的示例:

cat /usr/share/containers/mounts.conf
/usr/share/rhel/secrets:/run/secrets

seccomp.json

/usr/share/containers/seccomp.json

seccomp.json 包含允许在容器内部使用的 seccomp 规则的白名单。此文件通常由 containers-common 包提供。上面的链接将带您到 seccomp.json 文件。

policy.json

/etc/containers/policy.json

手册页: policy.json.5

Fedora containers-common 包中的示例:

(此处应该提供一个 policy.json 的示例内容,但原文中并未提供。在实际情况下,您可以从 Fedora 的 containers-common 包中找到实际的 policy.json 文件,并展示其部分内容或结构。)

cat /etc/containers/policy.json
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports":
{
"docker-daemon":
{
"": [{"type":"insecureAcceptAnything"}]
}
}
}