编辑此页面

将 Podman 与 Quarkus 一起使用

Podman 是一个开源的、无守护进程的、无 root 权限的容器引擎,用于在 Linux、Windows 和 Mac 上开发、管理和运行 OCI 容器。它可以用于支持 Quarkus 上的容器功能和开发服务。

安装 Podman

Podman 的安装方式取决于您使用的操作系统,并且所需的步骤也会随着 Podman 版本的变化而变化。对于 Mac 和 Windows,我们强烈建议通过 Podman Desktop 图形应用程序进行安装。 这是最简单的选择,步骤最少,它增加了额外的功能,例如自动启动,并且有助于管理未来的更新。 也可以使用仅 CLI 的选项。 但是,此设置需要额外的手动任务来管理、更新和启动 Podman Machine 环境。

Mac 上的 Homebrew 包管理器 (brew) 不应被用于安装 Podman,因为它会导致未经验证的组件组合。 这是因为 Homebrew 在项目之间共享依赖项,并且对升级请求的审查有限。 例如,有几个实例 qemu 的更新在 Apple Silicon 上中断,从而阻止了 Podman Machine VM 的启动。

在 Linux 上,Podman 集成到操作系统中,并通过系统的包管理器进行安装。 与 Mac 和 Windows 一样,也可以安装 Podman Desktop 来补充 Podman CLI。 但是,在 Linux 上,Podman Desktop 充当本机 Podman 集成的客户端,并且不管理底层 Podman 安装。

有关最新版本的 Podman Desktop,请参阅 https://desktop.podman.org.cn/downloads/

此外,如果您使用的是 Linux,请参阅 Podman Linux 安装文档,了解有关将 Podman 安装到特定 Linux 发行版的说明。

Docker 兼容模式

在 Mac 或 Windows 上安装 Podman Desktop 时,在出现提示时启用 Docker 兼容模式非常重要。 这将确保在您的帮助下设置 podman-mac-helper(通常是在启动后提示您执行的手动操作),这是支持 /var/run/docker.sock(特权位置)所必需的。 它还将安装对 Docker Compose 的支持。

平台差异

虽然与容器的交互在 Mac、Windows 和 Linux 之间几乎相同,但需要注意重要的环境差异。 值得注意的是,容器的执行方式不同,因为“容器是 Linux”。 更具体地说,容器包含 Linux 用户空间二进制文件,这些文件依赖于 Linux 内核 syscall 接口。 因此,Linux 容器无法在本机 macOS 或 Windows 上运行; 相反,它们需要使用运行 Linux 的虚拟机 (VM) 来托管它们。 对于需要它的系统,Podman 包括一个名为 Podman Machine 的子系统,该子系统用于管理此 VM。 Podman Desktop 执行此 VM 的引导式交互式设置,并将自动为您启动它。

Rootful vs Rootless

Podman 支持两种操作模式:rootful,在这种模式下,容器以 root 用户身份在 Linux 主机(或 Mac/Windows 中的 VM)上运行;另一种是 rootless,在这种模式下,容器在标准的 Unix 用户帐户下运行。 后者提供了更强大的安全性,但某些容器无法在增加的限制下运行。 例如,如果容器创建新设备、loopback mount 点并执行其他高度受限的操作,则必须以 root 用户身份运行它们。 请注意,这不应与 Containerfile/Dockerfile 中指定的 USER 值混淆,该值是指容器内的进程如何看待自己。 在 rootless 模式下,在具有 USER "root" 的容器中运行的进程将彼此显示为 root 用户,但由于 pid 命名空间,它们实际上将作为主机系统上的标准受限用户帐户运行。

在 Win & Mac 上配置

在涉及 Podman Machine 管理的 VM(Mac & Windows)的系统上,容器客户端和 Podman 命令远程通信到运行 VM 的 rootful 或 rootless 系统服务。 使用哪个由 Podman Machine 的 rootful 设置决定。 为了获得最大的兼容性,Podman Desktop 默认启用 rootful 用于新的 Machine 实例。 这对此的安全影响有限,因为 VM 本身是在用户进程下运行的。 也可以通过 podman 命令更改此设置

podman machine set --rootful=true # or false
podman machine stop
podman machine start

在 Linux 上配置

在 Linux 系统上,建议使用用户 systemd 服务在 rootless 配置中配置客户端访问。

可以使用以下命令启用此功能

systemctl --user enable podman.socket --now

在 Linux 上设置 DOCKER_HOST

通过上面的 Linux 上的 rootless 设置,您将需要通过设置 DOCKER_HOST 环境变量以指向用户服务 podman socket 来配置客户端,例如 Quarkus 和 Testcontainers。 可以使用使用 podman 命令查询路径的表达式来设置路径

export DOCKER_HOST=unix://$(podman info --format '{{.Host.RemoteSocket.Path}}')

其他 Linux 设置

镜像的短名称

Testcontainers 和 Quarkus Dev Services 还希望他们所请求的容器服务是非交互式的。 如果您在 Docker 或 Podman 配置中配置了多个注册表,并且在使用短镜像名称时,Podman 会响应一个提示,询问应使用哪个注册表来拉取镜像。

虽然我们建议您避免短名称,并始终使用包括注册表的完全指定名称,但不幸的是,Testcontainers 目前在内部依赖于短名称。 如果您直接或通过开发服务使用 Testcontainers,则需要通过在 /etc/containers/registries.conf 中设置 Podman 的 short-name-mode="disabled" 配置属性来禁用此提示。

相关内容