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 获取。