1.8. 对 rootless 容器的特别考虑

以非 root 用户身份运行容器时,需要考虑以下事项:

  • 对于 root 用户(/var/lib/containers/storage)和非 root 用户($HOME/.local/share/containers/storage),主机容器存储的路径是不同的。
  • 运行无根容器的用户被授予在主机系统上作为用户和组群 ID 运行的特殊权限。但是,它们对主机上的操作系统没有 root 特权。
  • 如果您手动更改 /etc/subuid/etc/subgid,则必须运行 podman system migrate 命令,以允许应用新的更改。
  • 如果您需要配置 rootless 容器环境,请在主目录($HOME/.config/containers)中创建配置文件。配置文件包括 storage.conf (用于配置存储)和 containers.conf (用于各种容器设置)。您还可以创建 registry.conf 文件,以标识使用 Podman 进行拉取、搜索或运行镜像时可用的容器注册表。
  • 有些系统功能在没有 root 特权的情况下无法更改。例如,您无法通过在容器内设置 SYS_TIME 功能并运行网络时间服务(ntpd)来更改系统时钟。您必须以 root 用户身份运行该容器,绕过 rootless 容器环境,并使用 root 用户的环境。例如:

    # podman run -d --cap-add SYS_TIME ntpd

    请注意,这个示例允许 ntpd 为整个系统调整时间,而不只是在容器内调整。

  • rootless 容器无法访问端口号小于 1024 的端口。在 rootless 容器命名空间中,它可以启动一个服务,该服务从容器中公开 httpd 服务的端口 80 ,但它不能在命名空间外访问:

    $ podman run -d httpd

    但是,容器需要 root 权限,使用 root 用户的容器环境向主机系统公开该端口:

    # podman run -d -p 80:80 httpd
  • 工作站的管理员可以允许用户在编号低于 1024 的端口上公开服务,但他们应了解安全隐患。例如,普通用户可以在官方端口 80 上运行 Web 服务器,并让外部用户认为它是由管理员配置的。在工作站上进行测试是可以接受的,但在网络可访问的开发服务器上可能不是一个好主意,绝对不应该在生产服务器上这样做。要允许用户将端口绑定到 80 以下的端口,请运行以下命令:

    # echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start