用podman代替docker:更轻量更安全的云原生窗口,使用国内镜像源及自动重新启动


发布者 ourjs  发布时间 1782804537506
关键字 云原生 

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)

  1. 机器所有容器统一受 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
  1. 为窗口创建独立服务,方便单独启停 以 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








  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA