Podman 是什么
Podman 是一个由 Red Hat 主导开发的容器引擎,与 Docker 的主要区别在于其无守护进程(daemonless) 的架构。
无守护进程:Docker 所有操作都依赖一个常驻后台的 dockerd 守护进程。一旦该进程出现问题,会影响所有容器。而 Podman 直接与 Linux 内核交互,无需中间层。
资源占用更低:因为没有常驻的守护进程,Podman 在空闲时几乎不占用资源。有测试表明,其内存占用比 Docker 少 60-70%,具体到数值,Docker 守护进程常驻内存约 80-120MB,而 Podman 仅需 30-50MB。
启动更快:Podman 的容器启动速度通常比 Docker 快 20-30%。
安全性更强: Docker 的用户会被加入 docker 组,该权限接近于 root,存在安全隐患。而 Podman 从设计之初就原生支持无 root 权限运行容器,能有效避免容器提权攻击。
攻击面更小:Docker 的守护进程以 root 权限运行,是潜在的攻击目标。Podman 的无守护进程设计显著缩小了潜在的攻击面。
安装
apt update
apt install podman -y
验证:
podman --version
podman version 4.9.3
安装成功:
与 Docker 兼容
podman-docker:这是一个非常实用的工具。安装后,系统会将 docker 命令的调用透明地重定向到 Podman。这意味着你可以在不更改任何脚本或习惯的情况下,背后实际使用 Podman。
podman-compose:Podman 官方提供了 podman-compose 工具,用于解析和运行 docker-compose.yml 文件,实现了对 Docker Compose 工作流的兼容。
安装:
apt install podman-docker -y
输入 docker 命令
docker version
输出 :
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Client: Podman Engine
Version: 4.9.3
API Version: 4.9.3
Go Version: go1.22.2
Built: Thu Jan 1 08:00:00 1970
OS/Arch: linux/amd64
配置短名称解析和国内镜像源
Podman 默认不允许使用镜像的短名称(比如 portainer/portainer-ce:latest),它要求镜像名必须明确指定完整的仓库地址。
定位配置文件:你可以编辑系统级的文件 /etc/containers/registries.conf,或者创建用户级的 $HOME/.config/containers/registries.conf 文件(推荐用户级,无需 sudo)。
编辑配置:在配置文件中添加或修改 unqualified-search-registries 选项。
编辑
nano /etc/containers/registries.conf
填入以下内容:
unqualified-search-registries = ["docker.io", "quay.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "docker.xuanyuan.me"
[[registry.mirror]]
location = "docker.m.daocloud.io"
[[registry.mirror]]
location = "docker.1ms.run"
Podman 不像 Docker 有 dockerd 服务,改完 /etc/containers/registries.conf 镜像配置即时生效,无需重启服务;
Podman 自动重启
Podman 无 dockerd 常驻守护进程(Daemonless 架构),podman run --restart=always 只负责容器异常崩溃重启,不负责整机开机重启,和 Docker 行为完全不一样。 两种自启方案(Portainer 专用,root 部署推荐方案 2)
- 机器所有容器统一受 podman-restart 管控,不方便单独启停 Portainer。
podman-restart.service 内容:
/* systemctl status podman-restart.service ○ podman-restart.service - Podman Start All Containers With Restart Policy Set To Always Loaded: loaded (/usr/lib/systemd/system/podman-restart.service; disabled; preset: enabled) Active: inactive (dead) Docs: man:podman-start(1) */
systemctl enable --now podman-restart.service
- 为窗口创建独立服务,方便单独启停 以 Portainer 容器为例:
#### 1.生成service文件(当前目录生成container-portainer.service)
podman generate systemd --name portainer --new --files --restart-policy always
#### 2.移入系统服务目录
mv container-portainer.service /etc/systemd/system/
# 3.重载systemd、设置开机自启
systemctl daemon-reload
systemctl enable --now container-portainer
