For the complete documentation index, see llms.txt. This page is also available as Markdown.

32.3 Podman 容器管理

Podman 是由红帽(Red Hat)主导开发的开源容器运行时,是 Docker 的替代方案,命令行接口与 Docker 高度兼容。Podman 采用无守护进程(daemonless)架构,每个容器作为独立进程运行,无需始终运行后台守护进程,提高了系统安全性,降低了单点故障风险。

在 FreeBSD 平台上,Podman 运行 Linux 容器时依赖 Linux 兼容层(Linuxulator),运行 FreeBSD 原生容器时则基于 Jail 机制实现隔离。对于通过 Linux 兼容层运行的容器,可使用命令 jls 查看其底层 Jail 结构。通过 sysctl -d security.jail.param 可列出所有可供查询的 Jail 内核参数,这些参数反映了每个容器对应的底层 Jail 属性。

Podman 容器运行时
   
   ├── Linux 容器
      
       依赖
      
      Linux 兼容层(Linuxulator)
      
       底层隔离
      
      Jail 机制
   
   └── FreeBSD 原生容器
       
        直接基于
       
       Jail 机制

安装 Podman

安装 sysutils/podman-suite 元包时,会同时安装 sysutils/buildah(用于构建容器镜像)、sysutils/podman(容器运行时)、sysutils/skopeo(用于操作容器镜像)和 sysutils/catatonit(容器初始化进程)。

  • 使用 pkg 安装

  • 使用 Ports 安装

  • 查看安装后的配置信息

配置 fstab 文件

在 FreeBSD 上使用 Podman,需要配置文件系统挂载点。fdescfs 是 FreeBSD 提供的文件描述符文件系统,可将进程的文件描述符映射为文件系统节点,Podman 依赖该文件系统在容器内部传递文件描述符。

将下列行写入 /etc/fstab 文件:

随后执行下列命令使之立即生效:

配置网络

Podman 借助 PF(Packet Filter)防火墙完成容器网络的地址转换与流量控制,容器可以通过宿主机网络接口访问外部网络。

若系统此前未配置过 PF,可直接复制 Podman 提供的配置示例:

编辑 /etc/pf.conf 文件,将 ix0 替换为当前使用的网卡,可使用命令 ifconfig 查看:

若系统已运行 PF 且存在自定义规则集,直接复制示例文件将覆盖现有配置。此时应只提取与容器网络相关的规则追加到现有 /etc/pf.conf 中,核心需要添加以下内容:

其中 $ext_if 需替换为实际网卡名称,网段 10.88.0.0/16 为 Podman 默认网桥子网。添加规则后执行 pfctl -f /etc/pf.conf 重新加载配置即可生效。

接下来启动 PF 防火墙。net.pf.filter_local=1 参数的作用是启用 PF 对发往本机地址的数据包的过滤处理,启用后 PF 可以对这类数据包应用 NAT/rdr 等规则,从而实现容器与宿主机之间的网络通信。

创建 ZFS 存储池

管理容器的存储资源,建议创建专用的 ZFS 文件系统,具体操作如下:

创建 ZFS 文件系统 zroot/containers,并将挂载点设置为 /var/db/containers

启动服务

启动相关服务:

项目结构:

测试 Ubuntu 镜像

服务启动完成后,可测试拉取 Ubuntu 镜像验证 Podman 是否正常工作:

  • 测试拉取 Ubuntu 镜像

  • 查看当前拉取的镜像

  • 打印系统版本(仅打印前 5 行)

  • 进入容器

测试 FreeBSD 维护者打包的 Nginx 容器

除了 Linux 镜像外,Podman 也可以运行 FreeBSD 原生容器。本节测试 FreeBSD 维护者打包的 Nginx 容器:

在浏览器中打开 http://ip:8080 即可访问 Nginx 测试页面。

更多用法

  • 查看日志

  • 查看容器运行状态

  • 停止并删除容器

  • 删除镜像(必须先删除引用该镜像的容器)

使用 FreeBSD 容器

除了第三方维护者提供的容器外,也可以直接从 Docker Hub 拉取官方的 FreeBSD 镜像:

参考文献

最后更新于