本文档风哥主要介绍Podman的容器管理,包括容器的概念、生命周期、操作以及容器的部署和监控等内容。风哥教程参考Podman官方文档Container Management部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 容器概念
容器是一个轻量级、可移植、自包含的软件包,包含运行应用所需的一切:代码、运行时、库、环境变量和配置文件。Podman使用容器来运行应用,每个容器都是一个独立的运行环境。更多视频教程www.fgedu.net.cn
- 轻量级:比虚拟机更轻,启动更快
- 可移植:可以在不同的环境中运行
- 隔离性:容器之间相互隔离
- 一致性:在不同环境中运行结果一致
- 可伸缩:可以快速创建和销毁
1.2 容器生命周期
容器的生命周期包括以下几个阶段:
- 创建:使用podman create命令创建容器
- 运行:使用podman start命令启动容器
- 暂停:使用podman pause命令暂停容器
- 恢复:使用podman unpause命令恢复容器
- 停止:使用podman stop命令停止容器
- 删除:使用podman rm命令删除容器
1.3 容器操作
Podman的容器操作主要包括以下几个方面:
- 创建和运行容器:使用podman run命令
- 查看容器:使用podman ps命令
- 停止和启动容器:使用podman stop和podman start命令
- 删除容器:使用podman rm命令
- 进入容器:使用podman exec命令
- 查看容器日志:使用podman logs命令
- 查看容器详情:使用podman inspect命令
Part02-生产环境规划与建议
2.1 容器管理策略
生产环境中Podman的容器管理策略:
## 容器命名
– 为容器设置有意义的名称
– 使用一致的命名规范
– 避免使用默认名称
## 容器标签
– 为容器添加标签,便于管理和识别
– 使用标签记录容器的用途、版本等信息
## 容器编排
– 使用podman-compose或Kubernetes进行容器编排
– 定义容器之间的依赖关系
– 实现容器的自动伸缩和故障转移
## 容器版本管理
– 使用固定版本的镜像
– 建立容器版本控制机制
– 定期更新容器
## 容器清理
– 定期清理停止的容器
– 清理无用的容器和镜像
– 释放存储空间
2.2 容器安全
生产环境中Podman的容器安全考虑:
## 镜像安全
– 使用官方镜像或可信来源的镜像
– 定期扫描镜像中的安全漏洞
– 及时更新镜像
## 容器隔离
– 使用非root用户运行容器
– 限制容器的权限和能力
– 配置适当的SELinux设置
– 使用网络隔离
## 数据安全
– 保护容器数据
– 定期备份数据
– 加密敏感数据
## 运行时安全
– 监控容器的运行状态
– 检测异常行为
– 配置适当的防火墙规则
2.3 容器资源管理
生产环境中Podman的容器资源管理:
- CPU限制:为容器设置CPU使用限制,避免CPU争用
- 内存限制:为容器设置内存使用限制,避免内存不足
- 磁盘限制:为容器设置磁盘使用限制,避免磁盘空间耗尽
- 网络限制:为容器设置网络带宽限制,避免网络拥塞
Part03-生产环境项目实施方案
3.1 容器基础操作
3.1.1 运行容器
$ podman run -d -p 8080:80/tcp –name fgedu-httpd docker.io/library/httpd
# 输出日志
7890123456ab
# 查看运行中的容器
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/httpd httpd-foreground 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp fgedu-httpd
3.1.2 停止和启动容器
$ podman stop fgedu-httpd
# 输出日志
fgedu-httpd
# 启动容器
$ podman start fgedu-httpd
# 输出日志
fgedu-httpd
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/httpd httpd-foreground 10 minutes ago Up 1 minute ago 0.0.0.0:8080->80/tcp fgedu-httpd
3.1.3 删除容器
$ podman rm fgedu-httpd
# 输出日志
fgedu-httpd
# 查看所有容器
$ podman ps -a
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2 容器高级操作
3.2.1 进入容器
$ podman exec -it fgedu-httpd /bin/bash
# 输出日志
root@7890123456ab:/usr/local/apache2#
# 在容器中执行命令
root@7890123456ab:/usr/local/apache2# ls -la
# 退出容器
root@7890123456ab:/usr/local/apache2# exit
3.2.2 查看容器日志
$ podman logs fgedu-httpd
# 输出日志
127.0.0.1 – – [04/May/2020:08:33:48 +0000] “GET / HTTP/1.1” 200 45
127.0.0.1 – – [04/May/2020:08:33:50 +0000] “GET / HTTP/1.1” 200 45
127.0.0.1 – – [04/May/2020:08:33:51 +0000] “GET / HTTP/1.1” 200 45
3.2.3 查看容器详情
$ podman inspect fgedu-httpd
# 输出日志(部分)
[
{
“Id”: “7890123456ab”,
“Created”: “2026-04-10T10:00:00Z”,
“Path”: “httpd-foreground”,
“Args”: [],
“State”: {
“OciVersion”: “1.0.2-dev”,
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 12345,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2026-04-10T10:00:00Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
…
}
]
3.3 容器监控
3.3.1 查看容器资源使用情况
$ podman stats fgedu-httpd
# 输出日志
ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS
7890123456ab fgedu-httpd 0.10% 6.25MB / 16.0GB 0.04% 1.2MB / 512.0KB 0B / 0B 6
3.3.2 查看容器进程
$ podman top fgedu-httpd
# 输出日志
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 22m13.33281018s pts/0 0s httpd -DFOREGROUND
daemon 3 1 0.000 22m13.333132179s pts/0 0s httpd -DFOREGROUND
daemon 4 1 0.000 22m13.333276305s pts/0 0s httpd -DFOREGROUND
daemon 5 1 0.000 22m13.333818476s pts/0 0s httpd -DFOREGROUND
Part04-生产案例与实战讲解
4.1 Web容器部署
4.1.1 部署Nginx容器
# 拉取Nginx镜像
$ podman pull docker.io/library/nginx
# 运行Nginx容器
$ podman run -d -p 80:80/tcp –name fgedu-nginx \
-v /Podman/fgdata/nginx/conf:/etc/nginx/conf.d:z \
-v /Podman/fgdata/nginx/html:/usr/share/nginx/html:z \
docker.io/library/nginx
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6543217890ab docker.io/library/nginx nginx -g daemon 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp fgedu-nginx
# 测试Nginx服务
$ curl http://localhost
# 输出日志
Welcome to nginx!
…
4.2 数据库容器部署
4.2.1 部署PostgreSQL容器
# 拉取PostgreSQL镜像
$ podman pull docker.io/library/postgres:14
# 运行PostgreSQL容器
$ podman run -d -p 5432:5432 –name fgedu-postgres \
-v /Podman/fgdata/postgres/data:/var/lib/postgresql/data:z \
-e POSTGRES_PASSWORD=fgedu123 \
-e POSTGRES_USER=fgedu \
-e POSTGRES_DB=fgedudb \
docker.io/library/postgres:14
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3216549870ab docker.io/library/postgres:14 postgres 5 minutes ago Up 5 minutes ago 0.0.0.0:5432->5432/tcp fgedu-postgres
# 连接PostgreSQL
$ podman exec -it fgedu-postgres psql -U fgedu -d fgedudb
# 输出日志
psql (14.0 (Debian 14.0-1.pgdg110+1))
Type “help” for help.
fgedudb=#
4.3 应用容器部署
4.3.1 部署Node.js应用容器
# 创建项目目录
$ mkdir -p nodeapp
$ cd nodeapp
# 创建Dockerfile
$ cat > Dockerfile << EOF
FROM docker.io/library/node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
EOF
# 创建package.json
$ cat > package.json << EOF
{
"name": "nodeapp",
"version": "1.0.0",
"description": "Node.js app",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
EOF
# 创建app.js
$ cat > app.js << EOF
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send(‘
Hello from Node.js!
‘);
});
app.listen(3000, () => {
console.log(‘App listening on port 3000!’);
});
EOF
# 构建镜像
$ podman build -t fgedu/nodeapp:latest .
# 运行容器
$ podman run -d -p 3000:3000 –name fgedu-nodeapp fgedu/nodeapp:latest
# 测试应用
$ curl http://localhost:3000
# 输出日志
Hello from Node.js!
Part05-风哥经验总结与分享
5.1 容器管理最佳实践
Podman容器管理的最佳实践:
- 使用有意义的容器名称:为容器设置有意义的名称,便于管理和识别
- 设置资源限制:为容器设置CPU、内存等资源限制,避免资源争用
- 使用卷进行数据持久化:使用卷或绑定挂载进行数据持久化,避免数据丢失
- 配置健康检查:为容器配置健康检查,监控容器状态
- 使用非root用户运行容器:提高容器的安全性
- 定期清理容器:定期清理停止的容器和无用的镜像,释放存储空间
- 监控容器:监控容器的运行状态和资源使用情况,及时发现和解决问题
- 备份容器数据:定期备份容器数据,防止数据丢失
5.2 常见问题与解决方案
Podman容器管理中的常见问题与解决方案:
## 问题1:容器无法启动
# 解决方案:
– 检查镜像是否存在
– 检查端口是否被占用
– 检查资源是否足够
– 查看容器日志:podman logs
## 问题2:容器网络连接问题
# 解决方案:
– 检查网络配置
– 检查防火墙规则
– 检查DNS配置
– 使用podman network inspect查看网络详情
## 问题3:容器数据丢失
# 解决方案:
– 使用卷或绑定挂载进行数据持久化
– 定期备份容器数据
– 实现数据备份策略
## 问题4:容器资源使用过高
# 解决方案:
– 为容器设置资源限制
– 优化容器应用
– 增加容器实例或升级硬件
## 问题5:容器权限问题
# 解决方案:
– 使用正确的用户权限
– 配置适当的文件权限
– 使用rootless容器
5.3 故障排查
Podman容器管理的故障排查:
## 容器启动失败
– 查看容器日志:podman logs
– 检查容器配置:podman inspect
– 检查端口占用:netstat -tulpn | grep
## 容器网络问题
– 检查网络配置:podman network inspect
– 检查防火墙规则:sudo firewall-cmd –list-all
– 测试网络连接:podman exec
– 检查DNS配置:podman exec
## 容器存储问题
– 检查磁盘空间:df -h
– 检查存储配置:cat /etc/containers/storage.conf
– 检查卷权限:ls -la /Podman/fgdata
– 检查容器挂载:podman inspect
## 容器性能问题
– 查看资源使用:podman stats
– 查看容器进程:podman top
– 优化容器配置:调整资源限制
– 检查应用性能:使用应用监控工具
## 容器安全问题
– 扫描镜像漏洞:使用Trivy等工具
– 检查容器权限:podman inspect
– 检查SELinux设置:sudo sestatus
– 查看容器日志:podman logs
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
