1. 概述

Podman 是一个开源的容器引擎。其最大优势在于它是无守护进程(daemonless)的。这意味着在运行 Podman 时,不会启动一个后台进程。因此,不需要像运行 Docker 这类守护进程型引擎时那样依赖 root 权限。

Docker 默认是以守护进程方式运行的,并且通常以 root 用户身份运行。但即便如此,我们依然可以在 Docker 容器中使用 Podman,从而在 Docker 的环境中获得 Podman 的优势。

✅ 本文目标是:演示如何在 Docker 容器中安装并使用 Podman


2. 前置条件

要完成本文中的操作,唯一需要的前提条件是在 Linux(以 Ubuntu 为例)上安装 Docker

默认情况下,Docker 守护进程绑定的是 Unix 套接字,而该套接字归 root 用户所有。因此,普通用户在执行 docker 命令时通常需要加上 sudo

但我们可以通过将用户添加到 docker 用户组来绕过这个限制,从而让非 root 用户也能运行 Docker 命令:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

✅ 完成上述操作后,就可以无需 sudo 直接运行 Docker 命令了,例如:

$ docker run hello-world

3. 在 Docker 中运行 Podman

准备好 Docker 并为非 root 用户赋予执行权限后,接下来我们就可以在 Docker 容器中运行 Podman。

我们使用的是 Red Hat 提供的官方镜像:quay.io/podman/stable。这个镜像专为在容器中运行 Podman 设计。

3.1. 使用 --privileged 标志

⚠️ 关键点:启动容器时必须带上 --privileged 标志。

  • 原因:Podman 会在容器中执行一些需要访问内核文件系统的操作,例如挂载文件系统。
  • 如果不加此标志,容器默认是以只读方式挂载内核文件系统,导致 Podman 无法正常运行。

3.2. 以 root 用户身份运行 Podman

我们可以这样启动一个容器:

$ docker run \
-it \
--privileged \
quay.io/podman/stable bash

进入容器后,可以直接使用 podman 命令验证是否安装成功:

$ podman

输出内容会显示 Podman 支持的命令列表(如 run, build, exec 等),说明 Podman 已正确安装。

然后我们运行一个 Podman 容器:

$ podman run hello-world

输出如下(简化):

!... Hello Podman World ...!

✅ 查看镜像和容器状态:

$ podman images
$ podman ps -a

Podman 作为 root 用户运行时,会将相关数据保存在 /var/lib/containers/storage 目录下。


3.3. 以非 root 用户运行 Podman

如果希望以非 root 用户身份运行 Podman,可以使用镜像中预置的 podman 用户:

$ docker run \
--user podman \
-it \
--privileged \
quay.io/podman/stable bash

进入容器后,同样可以运行 Podman 命令:

$ podman run hello-world

查看镜像和容器:

$ podman images
$ podman ps -a

⚠️ 不同之处在于,此时 Podman 会将数据存储在非 root 用户目录下:

/home/podman/.local/share/containers

4. 常见问题及解决方法

4.1. 没有 root 权限运行 Docker 容器

错误信息示例:

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

✅ 解决方案:

  • 方法一:在命令前加 sudo
  • 方法二:将当前用户加入 docker 用户组(如第 2 节所述)

4.2. 忘记使用 --privileged 标志

错误信息示例:

Error: mounting storage for container
Error: configure storage: mount

✅ 解决方案:在 docker run 命令中添加 --privileged 标志。

4.3. Podman UID/GID 不足问题

错误信息示例:

potentially insufficient UIDs or GIDs available in user namespace

✅ 解决方案:

  • 修改容器配置,扩大 UID/GID 分配范围(默认为 5000,可扩展至 65000)

5. 小结

本文演示了如何在 Docker 容器中运行 Podman:

  • 可以以 root 用户或非 root 用户身份运行
  • 必须使用 --privileged 标志以确保 Podman 能访问内核资源
  • Podman 支持 rootless 模式,但需注意 UID/GID 配置
  • 遇到权限问题时,检查用户组权限或使用 sudo

✅ 最后提醒:建议在官方支持的操作系统上进行操作,以减少兼容性问题。

完整的 Docker 命令脚本可在 GitHub 获取。


原始标题:Executing Podman inside a Docker Container