Podman容器实战:从安装到部署Nginx的完整教程
Podman 是一个无需守护进程的容器引擎,命令与 Docker 高度兼容,适合希望减少 root 服务依赖、提升隔离性的场景。
本文用一台全新 CentOS 7 或 Ubuntu 20.04 服务器演示 Podman 容器实战:从安装、配置镜像加速,到运行 Nginx 并挂载网站目录,最后验证访问。
环境准备与安装
以下步骤假设你已通过 SSH 登录服务器,并拥有 sudo 权限。
CentOS 7 和 Ubuntu 20.04 的安装命令略有不同,请按系统选择。
CentOS 7 安装:
sudo yum install -y podman
Ubuntu 20.04 安装:
sudo apt update
sudo apt install -y podman
安装完成后,检查版本:
podman --version
如果输出版本号(如 podman version 3.4.4),说明安装成功。
若提示找不到命令,请确认软件源是否正常,或尝试 sudo yum makecache 后重装。
配置国内镜像加速
Podman 默认从 Docker Hub 拉取镜像,国内网络可能较慢。
可以修改配置文件,使用国内镜像站。
编辑 /etc/containers/registries.conf,在文件末尾添加:
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "hub-mirror.c.163.com"
保存后,Podman 会自动尝试镜像加速。
注意:不同 Podman 版本配置语法可能有差异,如果拉取镜像时提示 mirror 相关错误,可暂时注释掉 mirror 部分,或查阅对应版本文档。
运行第一个 Nginx 容器
拉取 Nginx 官方镜像:
podman pull nginx:alpine
alpine 标签表示基于 Alpine Linux 的精简镜像,体积较小。
拉取完成后,用以下命令启动容器:
podman run -d --name mynginx -p 8080:80 nginx:alpine
参数解释:
-d:后台运行--name mynginx:容器命名为 mynginx-p 8080:80:将宿主机 8080 端口映射到容器 80 端口nginx:alpine:使用的镜像
执行后,查看容器状态:
podman ps
如果看到 mynginx 状态为 Up,说明容器已运行。
此时在浏览器访问 http://服务器IP:8080,应能看到 Nginx 欢迎页。
如果无法访问,请检查服务器防火墙是否放行 8080 端口:
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
Ubuntu 系统可使用 sudo ufw allow 8080。
挂载网站目录实现持久化
容器内的文件在容器删除后会丢失,生产环境需要把网站目录挂载到宿主机。
先创建本地目录:
mkdir -p /data/nginx/html
然后停止并删除旧容器:
podman stop mynginx
podman rm mynginx
重新运行,并挂载目录:
podman run -d --name mynginx -p 8080:80 -v /data/nginx/html:/usr/share/nginx/html:Z nginx:alpine
注意 :Z 标签用于 SELinux 环境,CentOS 7 默认开启 SELinux,不加可能导致容器内无法读取文件。
Ubuntu 通常不需要,但加上也不影响。
在宿主机创建测试页面:
echo "Hello Podman" > /data/nginx/html/index.html
再次访问 http://服务器IP:8080,应显示 Hello Podman。
常见报错与避坑
报错:Error: error creating container storage: the container name "mynginx" is already in use
说明已有同名容器存在。执行 podman rm mynginx 删除旧容器,或换一个名称。
报错:permission denied 访问挂载目录
通常是 SELinux 导致。确认挂载时加了 :Z 或 :z 标签。如果仍不行,可临时执行 sudo setenforce 0 测试,但生产环境不建议关闭 SELinux,应正确使用标签。
容器启动后立即退出
用 podman logs mynginx 查看日志。常见原因是配置文件错误或端口冲突。若端口被占用,可改用其他宿主机端口,如 -p 8081:80。
Podman 与 Docker 命令差异
Podman 支持大部分 Docker 命令,但 docker-compose 需换成 podman-compose,且 Podman 默认以当前用户运行容器。若需 root 权限运行,可使用 sudo podman,但建议优先使用普通用户模式。
验证与日常管理
检查容器运行状态:
podman ps -a
查看容器日志:
podman logs mynginx
进入容器内部:
podman exec -it mynginx /bin/sh
设置容器开机自启(需 root 权限):
sudo podman generate systemd --new --name mynginx > /etc/systemd/system/mynginx.service
sudo systemctl daemon-reload
sudo systemctl enable --now mynginx
注意:podman generate systemd 在不同版本中语法可能变化,
如果报错,
请使用 podman generate systemd --help 查看当前版本支持参数。
完成以上步骤后,你已经掌握了 Podman 容器实战的基本流程:安装、配置镜像、运行容器、挂载数据卷和排错。
后续可以继续尝试用 Podman 部署 MySQL、Redis 等常用服务,操作方式与 Nginx 类似。
常见问题
Podman 和 Docker 能同时安装吗?
可以,但两者命令可能冲突。如果已安装 Docker,建议使用 alias docker=podman 或直接使用 podman 命令,避免混淆。
普通用户运行 Podman 需要什么条件?
需要系统启用用户命名空间。CentOS 7 和 Ubuntu 20.04 默认支持,但部分内核参数可能限制。若普通用户运行失败,可尝试 sudo sysctl user.max_user_namespaces=15000 并写入 /etc/sysctl.conf。
Podman 容器如何随系统启动?
推荐用 systemd 管理,参考上文 podman generate systemd 步骤。注意该命令生成的 unit 文件依赖 Podman 版本,升级后可能需要重新生成。
如何删除所有停止的容器?
执行 podman container prune,按提示确认即可。