ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Podman 零基础 → 云计算实战手册

2026/9/10 23:56:17 拓冰建站 浏览量
Podman 零基础 → 云计算实战手册 文章目录Podman 零基础 → 云计算实战手册第 0 章 开工前必须知道的三件事第 1 章 安装与体检第 2 章 国内镜像源重点章2.1 正确写法v4 语法老写法已废弃2.2 当前实测可用的公共源2.3 拿到任何源先自己验一遍2.4 生产环境请不要依赖公共加速器第 3 章 Docker 迁移速查第 4 章 跑容器的生产级模板第 5 章 网络与存储第 6 章 企业应用实战可直接复制Nginx 反向代理RedisMinIO对象存储JenkinsPrometheus Grafana监控Nextcloud / GitLab不要用一条命令进生产第 7 章 交付Quadlet systemd第 8 章 日常运维下一步资料齐了。有个重要发现要先说网上大量 Podman 教程已经过期——2026 年 7 月 Podman 发了 6.0砍掉了 CNI、slirp4netns、cgroups v1、iptables 支持国内镜像源也换了一茬中科大、网易、上海交大的老地址已停服。我按当前2026-09的真实情况写。Podman 零基础 → 云计算实战手册第 0 章 开工前必须知道的三件事① 当前版本是 Podman 6.1.16.0 是一次断代式升级6.0 移除/改变对你的影响不再支持 cgroups v1必须是 cgroup v2老系统要先升级iptables → nftables防火墙规则要重写CNI → Netavark老网络配置失效slirp4netns → Pastarootless 网络后端换了装passt不装slirp4netnsBoltDB → SQLite首次启动自动迁移老数据注意备份网络隔离默认开启容器间默认不通需显式组网podman volume prune行为变更现在只清匿名卷清全部要加--all移除 Win10 / Intel Mac 支持桌面端注意安装时别再照抄yum install slirp4netns了——6.x 要的是passt。②podman generate systemd已废弃交付一律用 Quadlet官方明确该命令 deprecated只修 bug 不加功能。新项目请直接用 Quadlet.container文件 systemd。③ 国内源老教程的清单基本都废了中科大docker.mirrors.ustc.edu.cn2024-06 停服、网易hub-mirror.c.163.com停止同步、上海交大/南京大学/Azure CN 陆续下线。别再从旧博客复制地址了。第 1 章 安装与体检# RHEL 9 / Rocky 9 / Alma 9sudodnfinstall-ypodmannetavark passt containers-common# Ubuntu 24.04 / Debian 12sudoaptupdatesudoaptinstall-ypodmannetavark passt装完先体检再往下走这四条决定后面顺不顺podman--versionstat-fc%T /sys/fs/cgroup# 必须输出 cgroup2fs否则 Podman 6 跑不了podmaninfo--format{{.Host.RootlessNetwork}} {{.Host.CgroupVersion}}podmanrun--rmdocker.io/library/hello-worldrootless 前置以 demo 用户为例sudousermod--add-subuids100000-165535 --add-subgids100000-165535 demogrep^demo /etc/subuid /etc/subgidsudologinctl enable-linger demo# 不设这个重启后服务不会自启loginctl show-user demo|grepLinger最常见翻车点rootless 想绑 80/443 会permission denied。解法优先级用 8080/8443 → 上层用 Nginx 或防火墙转发 → 万不得已才sysctl net.ipv4.ip_unprivileged_port_start80。不要图省事直接用 root 跑容器。第 2 章 国内镜像源重点章2.1 正确写法v4 语法老写法已废弃很多人抄到的[registries.search]registries [...]是Podman v1/v2 的旧语法新版不认。正确的 TOML 长这样sudomkdir-p/etc/containers/registries.conf.dsudotee/etc/containers/registries.conf.d/01-mirror.confEOF unqualified-search-registries [docker.io] [[registry]] prefix docker.io location docker.io [[registry.mirror]] location docker.xuanyuan.me [[registry.mirror]] location docker.1ms.run [[registry.mirror]] location docker.m.daocloud.io EOF两个致命细节prefix和location都填docker.io加速域名只放[[registry.mirror]]。绝不能把加速域名写进unqualified-search-registries。Podman 只对docker.io做短名自动补library/的硬编码判断换成别的域名podman pull nginx就会找不到。mirror 地址末尾不要加/否则 TLS 握手失败。2.2 当前实测可用的公共源2026 年多份实测交叉验证源地址均速成功率定位轩辕免费docker.xuanyuan.me~12.3 MB/s99.2%个人/开发首选毫秒docker.1ms.run~11.8 MB/s99.5%稳定性优先DaoClouddocker.m.daocloud.io~9.5 MB/s97.6%老牌备选AtomHub开放原子atomhub.openatom.cn~8.2 MB/s100%仅 336 个可信基础镜像高安全场景已失效请从你的脚本里删掉docker.mirrors.ustc.edu.cn、hub-mirror.c.163.com、dockerhub.azk8s.cn、registry.docker-cn.com、上海交大/南京大学镜像。2.3 拿到任何源先自己验一遍源的状态按月变别信任何永久可用的清单curl-Ihttps://docker.xuanyuan.me/v2/# 关键看是否返回 200/401timepodmanpull docker.io/library/nginx:1.27-alpinepodmaninspect--format{{.Digest}}docker.io/library/nginx:1.27-alpine2.4 生产环境请不要依赖公共加速器第三方公益源有供应链风险、随时可能限流或停服。生产正解是三层# 1) 云厂商私有仓库阿里云 ACR / 腾讯云 TCR / 华为云 SWRpodmanlogin registry.cn-hangzhou.aliyuncs.compodmanpull docker.io/library/nginx:1.27podmantag docker.io/library/nginx:1.27 registry.cn-hangzhou.aliyuncs.com/ns/nginx:1.27podmanpush registry.cn-hangzhou.aliyuncs.com/ns/nginx:1.27# 2) 用 digest 锁死禁止 tag 漂移podmanpull registry.cn-hangzhou.aliyuncs.com/ns/nginxsha256:digest# 3) 批量分发用 skopeo 同步白名单或自建 Harborskopeosync--srcdocker--destdockerregistry.cn-hangzhou.aliyuncs.com/ns/nginx /mnt/mirror第 3 章 Docker 迁移速查命令 95% 一致差别在没有守护进程 rootless场景命令拉/看/删镜像podman pull/images/rmi跑/停/删容器podman run -d/stop/rm看日志podman logs -f进容器podman exec -it 名 sh构建podman build -t myapp:1.0 .资源占用podman stats --no-stream生成 systemd❌podman generate systemd→ ✅ Quadlet生成 K8s YAMLpodman generate kube想无痛迁移可以alias dockerpodman但别挂/var/run/docker.sock——Podman 没有那个中央守护进程。第 4 章 跑容器的生产级模板别再用podman run -d nginx这种裸命令了直接养成带防护的习惯podmanrun-d\--nameweb\-p127.0.0.1:8080:80\-vweb_data:/usr/share/nginx/html:Z\--read-only--tmpfs/var/cache/nginx:rw,size128m\--memory512m--cpus1.0--pids-limit512\--health-cmdcurl -fsS http://localhost:80/ || exit 1\--health-interval30s --health-start-period20s --health-retries3\--labelio.containers.autoupdateregistry\docker.io/library/nginx:1.27逐项含义--read-only只读根文件系统 tmpfs给可写目录:Z是 SELinux 标签RHEL 系需要Ubuntu 无害--health-start-period必须覆盖应用冷启动否则健康检查永远 startingautoupdate标签留给后面的自动更新。配置文件用Containerfile语法同 DockerfileFROM docker.io/library/alpine:3.20 RUN adduser -D appuser COPY --chownappuser app /app USER appuser # 关键非 root 运行 EXPOSE 8080 HEALTHCHECK CMD wget -qO- http://localhost:8080/healthz || exit 1 ENTRYPOINT [/app/server]第 5 章 网络与存储网络选型按角色选不是按功能多选场景方案坑rootless 单容器对外Pasta -p特权端口受限同主机多容器互通rootful 自定义 bridge需 root需要 LAN 独立 IPmacvlan宿主机访问容器麻烦K8s 风格Pod共享 localhost# rootful 组网容器间用名字互访sudopodmannetwork create appnet--subnet10.88.10.0/24sudopodmanrun-d--nameapi--networkappnet --network-alias api myapp:1.0sudopodmanrun-d--nameworker--networkappnet --network-alias worker myapp:1.0# 排障三板斧podmanport web ss-ltnp|grep8080journalctl--user-upodman-web.service存储选型方式适用风险命名卷数据库、应用状态备份/迁移要导出bind mount配置文件、代码目录主机权限直接暴露给容器tmpfs缓存、会话重启即丢NFS多副本共享root squash、文件锁、抖动podmanvolume create pgdatapodmanrun-d--namepg\-ePOSTGRES_PASSWORDChangeMe\-vpgdata:/var/lib/postgresql/data:Z\--shm-size128m\docker.io/library/postgres:17PostgreSQL 18 数据目录结构变了别把 17 的挂载路径机械套到新版本。第 6 章 企业应用实战可直接复制以下命令默认你已配好第 2 章的镜像源。Nginx 反向代理podmanrun-d--namenginx\-p127.0.0.1:8080:8080\-v./nginx.conf:/etc/nginx/nginx.conf:ro,Z\-vweb_certs:/etc/nginx/certs:Z\--read-only--tmpfs/var/cache/nginx:rw,size128m\--health-cmdcurl -fsS http://localhost:8080/healthz || exit 1\docker.io/library/nginx:1.27Redispodmanrun-d--nameredis\-p127.0.0.1:6379:6379\-vredis_data:/data:Z\--read-only--tmpfs/tmp:rw,size64m\--memory1g\docker.io/library/redis:7\--requirepass${REDIS_PASSWORD}--maxmemory512mb --maxmemory-policy allkeys-lruMinIO对象存储凭证别写命令行用 env 文件cat/etc/minio.envEOF MINIO_ROOT_USERadmin MINIO_ROOT_PASSWORDPleaseChangeMe EOFchmod600/etc/minio.envpodmanrun-d--nameminio\--env-file/etc/minio.env\-p127.0.0.1:9000:9000-p127.0.0.1:9001:9001\-vminio_data:/data:Z\quay.io/minio/minio server /data --console-address :9001quay.io国内可能慢建议先同步进你的私有仓库。Jenkinspodmanvolume create jenkins_homepodmanrun-d--namejenkins\-p127.0.0.1:8080:8080-p127.0.0.1:50000:50000\-vjenkins_home:/var/jenkins_home:Z\docker.io/jenkins/jenkins:lts-jdk21别把 docker.sock 挂进 Jenkins 当默认构建能力——用 agent 短期 token。Prometheus Grafana监控podmanvolume create prometheus-datapodmanrun-d--nameprometheus\-p127.0.0.1:9090:9090\-v./prometheus.yml:/etc/prometheus/prometheus.yml:ro,Z\-vprometheus-data:/prometheus:Z\docker.io/prom/prometheuspodmanrun-d--namegrafana\-p127.0.0.1:3000:3000\-vgrafana_data:/var/lib/grafana:Z\--env-file/etc/grafana.env\docker.io/grafana/grafana:latestNextcloud / GitLab不要用一条命令进生产这两类是应用栈不是单容器至少要拆成gitlab / nextcloud ├─ postgresql ├─ redis ├─ 对象存储 / NFS / 命名卷 └─ nginx 反代 TLS cron先用 Pod 或 Quadlet 组合跑通先验证备份恢复再开放外网。第 7 章 交付Quadlet systemd这是 Podman 相对 Docker 最大的优势——容器变成原生 systemd 服务。目录位置root/etc/containers/systemd/rootless~/.config/containers/systemd/Nginx 完整示例~/.config/containers/systemd/nginx.container[Unit] DescriptionNginx service Afternetwork-online.target Wantsnetwork-online.target [Container] Imagedocker.io/library/nginx:1.27 ContainerNamenginx PublishPort127.0.0.1:8080:80/tcp Volumenginx_conf:/etc/nginx:Z ReadOnlytrue Tmpfs/var/cache/nginx:rw,size128m HealthCmdcurl -fsS http://localhost:80/ || exit 1 HealthInterval30s HealthRetries3 PodmanArgs--memory512m --cpus1.0 --pids-limit512 AutoUpdateregistry [Service] Restartalways RestartSec10s [Install] WantedBydefault.target配套卷nginx_conf.volume[Volume] VolumeNamenginx_conf Driverlocal配套网络appnet.network[Network] NetworkNameappnet Driverbridge Subnet10.88.20.0/24部署流程rootlessmkdir-p~/.config/containers/systemdcp*.container *.volume *.network ~/.config/containers/systemd/ systemctl--userdaemon-reload# 关键触发生成器systemctl--userenable--nownginx.service systemctl--userstatus nginx.service journalctl--user-unginx.service-f服务没出现的排查顺序扩展名对不对 → 路径对不对 →[Install]的WantedBy是不是default.target→ lingering 开了没 →daemon-reload执行没。自动更新配合AutoUpdateregistrysystemctl--userenable--nowpodman-auto-update.timerpodmanauto-update --dry-run但数据库、GitLab、Jenkins 这类有状态服务不要开自动更新——先更新 tag在备用实例验证再按备份预案切换。离线交付podmansave docker.io/library/nginx:1.27-onginx-1.27.tarscpnginx-1.27.tar newhost:/srv/# 目标机podmanload-i/srv/nginx-1.27.tar第 8 章 日常运维# 日志推荐 journaldpodmanrun-d--log-driverjournald --log-opttagweb... journalctl--user-unginx.service-n200journalctlCONTAINER_NAMEnginx# 资源podmanstats --no-streampodmaninspect--format{{.HostConfig.Memory}} {{.HostConfig.CpuQuota}}web# 备份卷必须演练恢复podmanvolumeexportpgdata-opgdata.tarpodmanvolume create pgdatapodmanvolumeimportpgdata /srv/pgdata.tar故障速查表症状先查permission denied拉/推登录态、TLS、仓库授权rootless 绑不了 80/443特权端口、lingering、防火墙容器起来就退podman logs、entrypoint、依赖容器间解析不了名字同一网络别名6.x 网络隔离已默认开写数据报权限错UID/GID、SELinux:Z、--usernskeep-id健康检查一直 starting--health-start-period太短subuid不足用户映射范围、容器数上限安全八项部署前自问非 root 运行最小端口secret 走文件不走命令行镜像锁 digest卷有备份和 UID 映射重启策略测过日志不含敏感信息自动更新有回滚窗口下一步按这个顺序练podman run单容器 → 命名卷持久化 → 自定义网络多容器 → Pod → Quadlet 交付 →generate kube导 K8s YAML。