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)
玩得开心。