Podman

> Podman — 无守护进程的容器引擎,让 rootless 容器管理像呼吸一样自然。 --- 兄弟们,今天聊个我最近彻底入坑的工具——**Podman**。 先说个场景:你是不是也受够了 Docker 那套“客户端-守护进程”的架构?每次 `docker ps` 之前,心里都得默念“dockerd 还活着吧?”。尤其是公司服务器上,万一哪个同事手贱 `systemctl stop docker`,你正在跑的容器直接全灭,那种感觉……懂的都懂。 Podman 就是来治这个病的。它没有守护进程,每个容器直接作为 `podman` 命令的子进程跑。没有那个常驻的 `dockerd`,意味着你 `kill` 掉终端进程,容器要么继续跑,要么按你的策略退出,而不是被一个中央进程“连坐”。更爽的是,**普通用户直接就能跑 rootless 容器**,不用加 sudo,不用改用户组,安全性和自由度直接拉满。 而且,Podman 和 Docker 的 CLI 命令几乎 100% 兼容。你 `alias docker=podman`,然后该干嘛干嘛。`docker-compose` 也能用,用 `podman-compose` 或者直接 `podman play kube` 跑 k8s YAML,无缝衔接。 --- ### 下载与安装 官方下载页面在这:[https://podman.io/docs/installation](https://podman.io/docs/installation) 别慌,不是让你去编译源码。主流发行版基本都打包好了。 **Ubuntu / Debian 系:** ```bash sudo apt update sudo apt install podman ``` **Fedora / RHEL / CentOS(自带就是它):** ```bash sudo dnf install podman ``` **macOS(用 Homebrew):** ```bash brew install podman # 然后初始化虚拟机(因为 mac 上本质是跑在 Linux VM 里) podman machine init podman machine start ``` **Windows(用 WSL2 或 Podman Desktop):** 建议直接装 [Podman Desktop](https://podman-desktop.io/),图形化,省心。命令行党就 WSL2 里装 Ubuntu 再 `apt install podman`。 装完验证一下: ```bash podman --version ``` --- ### 基础使用:几乎零学习成本 如果你用过 Docker,下面这些命令你闭着眼都能敲出来。我直接给几个高频场景。 **1. 拉镜像 + 跑容器** ```bash # 拉一个 nginx podman pull docker.io/library/nginx:latest # 后台跑一个,映射端口 podman run -d --name my-web -p 8080:80 nginx # 看状态 podman ps -a ``` 注意,Podman 默认镜像源是 `docker.io`,但也可以直接拉 quay.io 的镜像,比如 `podman pull quay.io/podman/hello`。 **2. 进入容器** ```bash podman exec -it my-web /bin/bash ``` **3. 日志** ```bash podman logs -f my-web ``` **4. 停止/删除** ```bash podman stop my-web podman rm my-web ``` **5. 构建镜像(Dockerfile 直接能用)** ```bash cat > Dockerfile <<EOF FROM alpine RUN apk add curl CMD ["echo", "hello podman"] EOF podman build -t my-hello . podman run --rm my-hello ``` 看到没?除了命令从 `docker` 换成 `podman`,其他一模一样。 --- ### 进阶技巧:这才是精髓 既然叫“实用工具介绍”,不能只讲皮毛。下面这几个操作是我日常最依赖的,能帮你避开不少坑。 **技巧一:无 root 跑通一切(rootless 配置)** 如果你用普通用户跑 `podman run` 报错 `cannot find UID/GID`,别慌,执行一次: ```bash podman system migrate ``` 这会让 Podman 自动配置好用户命名空间映射。之后所有操作都不需要 sudo。 **技巧二:用 `podman play kube` 替代 docker-compose** 你有一个 `docker-compose.yml`?直接转成 k8s YAML 跑: ```bash podman generate kube my-container > my-pod.yaml podman play kube my-pod.yaml ``` 这个 `play kube` 能把 Pod 的概念真正落地。比如你要跑一个“redis + app”的组合,把它们放在同一个 Pod 里,共享 localhost 网络,比 docker-compose 的网络隔离更符合微服务习惯。 **技巧三:管理 Pod(容器组)** Podman 的原生概念就是 Pod(借鉴 k8s)。你不需要一个个起容器,直接起一个 Pod: ```bash podman pod create --name my-pod -p 8080:80 podman run --pod my-pod -d nginx podman run --pod my-pod -d redis ``` 这两个容器共享网络栈和 PID 命名空间,互相访问直接用 `localhost:6379`。爽不爽?而且这个 Pod 可以直接 `podman generate kube` 导出成 k8s 清单,迁移到集群零成本。 **技巧四:自动清理孤儿容器** 因为没有守护进程,你 `Ctrl+C` 退出终端后,容器可能还在跑。想清理没用的: ```bash podman container prune -f podman image prune -a ``` **技巧五:systemd 集成(开机自启)** 这个比 Docker 优雅太多。用 `podman generate systemd --new --name my-web` 生成 unit 文件,扔到 `~/.config/systemd/user/`,然后: ```bash systemctl --user daemon-reload systemctl --user enable --now container-my-web ``` 注意,这是**用户级**服务,不需要 root。而且 `--new` 参数意味着每次启动都会用当前容器配置重新创建容器,升级镜像后重启服务就是新容器,完美。 --- ### 踩坑提醒 1. **网络问题**:rootless 模式下,端口映射默认走 `slirp4netns`,性能略差。如果追求性能,可以装 `podman-docker` 包(它会提供 `docker` 命令的兼容层),或者用 `--network=host` 绕过。 2. **镜像源**:国内拉 docker.io 镜像慢?改 `/etc/containers/registries.conf`,把 `unqualified-search-registries` 加一个 `docker.m.daocloud.io` 之类的加速器。 3. **和 Docker 共存**:如果机器上已经装了 Docker,别冲突。Podman 默认用 `/run/podman/podman.sock`,不会抢 2375 端口。放心用。 --- ### 总结 Podman 不是“另一个 Docker”,它是“没有 Docker 病的 Docker”。对于个人开发者、CI/CD 流水线,尤其是那些不想为常驻守护进程买单的服务器环境,它简直是对症下药。而且它原生支持 k8s 工作流,未来迁移上云毫无压力。 最后给你一句忠告:**从今天开始,把 `docker` 替换成 `podman`,你的终端会感谢你的。** 如果遇到问题,记住 `podman --help` 永远是你的朋友。 去官网看看:[https://podman.io](https://podman.io) 玩得开心。