本文档风哥主要介绍Podman的架构原理和核心特性,以及在生产环境中的应用。风哥教程参考Podman官方文档Getting Started内容,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Podman的概念
Podman是一个无守护进程的容器引擎,用于创建和管理容器。它是libpod库的一部分,提供了与Docker兼容的命令行接口。Podman的主要特点是不需要守护进程,可以以root或非root用户身份运行容器。更多视频教程www.fgedu.net.cn
- 无守护进程设计
- 支持root和rootless容器
- 兼容Docker命令
- 支持Pod管理
- 支持容器检查点和迁移
1.2 Podman的架构原理
Podman的架构基于libpod库,采用无守护进程的设计模式。与Docker不同,Podman直接与容器运行时(如runc)交互,不需要通过守护进程来管理容器。这种设计带来了以下优势:
- 更高的安全性:没有长期运行的守护进程,减少了攻击面
- 更好的权限控制:可以以非root用户身份运行容器
- 更简单的架构:减少了组件数量,降低了复杂性
- 更好的系统集成:可以与systemd等系统服务更好地集成
1.3 Podman的核心特性
Podman的核心特性包括:
- 容器管理:创建、运行、停止、删除容器
- 镜像管理:搜索、拉取、推送、构建镜像
- Pod管理:创建和管理Pod,支持多容器组
- Rootless容器:以非root用户身份运行容器
- 网络管理:创建和管理容器网络
- 存储管理:管理容器存储和卷
- 容器检查点:支持容器状态保存和恢复
- Docker兼容:支持Docker命令和API
Part02-生产环境规划与建议
2.1 硬件要求
Podman的硬件要求取决于运行的容器数量和类型,以下是生产环境的建议配置:
– CPU:至少4核,推荐8核以上
– 内存:至少8GB,推荐16GB以上
– 存储:至少100GB,推荐使用SSD
– 网络:千兆网卡,推荐万兆网卡
# 大内存页配置
# 检查大内存页设置
$ cat /proc/meminfo | grep HugePages
# 透明大页设置
# 检查透明大页状态
$ cat /sys/kernel/mm/transparent_hugepage/enabled
# NUMA设置
# 检查NUMA状态
$ numactl –hardware
# TMPFS配置
# 检查TMPFS大小
$ df -h | grep tmpfs
2.2 操作系统要求
Podman支持多种操作系统,以下是生产环境的建议:
– Oracle Linux 9.3 / RHEL 9.3
– Oracle Linux 8.x / RHEL 8.x
– Oracle Linux 7.x / RHEL 7.x
# 可选操作系统
– 国产麒麟操作系统 Kylin v10 SP3
– 欧拉操作系统
# 操作系统参数配置
# 内核参数优化
$ cat /etc/sysctl.conf | grep -E “fs.file-max|kernel.sem|kernel.shmmni”
# 打开大内存页
$ echo “vm.nr_hugepages=16384” >> /etc/sysctl.conf
# 关闭透明大页
$ echo “transparent_hugepage=never” >> /etc/grub.conf
# 关闭NUMA
$ echo “numa=off” >> /etc/grub.conf
# 配置TMPFS大小
$ echo “tmpfs /tmp tmpfs defaults,size=8G 0 0” >> /etc/fstab
2.3 网络要求
Podman的网络要求:
- 网络连接:需要能够访问容器镜像仓库
- 端口映射:需要配置防火墙规则,允许容器端口访问
- 网络模式:支持桥接、host、overlay等网络模式
- DNS配置:确保容器能够解析DNS
Part03-生产环境项目实施方案
3.1 安装前准备
3.1.1 系统更新
$ sudo dnf update -y
# 安装必要的依赖
$ sudo dnf install -y epel-release
$ sudo dnf install -y slirp4netns fuse-overlayfs
3.1.2 安装Podman
$ sudo dnf install -y podman
# 验证安装
$ podman –version
podman version 4.9.3
# 查看Podman信息
$ podman info
3.2 基础操作实战
3.2.1 获取帮助
$ podman –help
# 获取子命令帮助
$ podman run –help
# 查看man手册
$ man podman
$ man podman-run
3.2.2 搜索和拉取镜像
$ podman search httpd –filter=is-official
# 拉取镜像
$ podman pull docker.io/library/httpd
# 查看本地镜像
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd latest 1234567890ab 2 weeks ago 148 MB
3.3 容器管理
3.3.1 运行容器
$ podman run -d -p 8080:80/tcp –name fgedu-httpd docker.io/library/httpd
# 查看容器ID
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.3.2 查看容器信息
$ podman inspect fgedu-httpd
# 查看容器日志
$ 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
# 查看容器进程
$ 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 部署HTTPD容器
4.1.1 测试HTTPD容器
$ curl http://localhost:8080
It works!
…
4.1.2 停止和删除容器
$ podman stop fgedu-httpd
fgedu-httpd
# 查看所有容器
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/httpd httpd-foreground 10 minutes ago Exited (0) 1 minute ago fgedu-httpd
# 删除容器
$ podman rm fgedu-httpd
fgedu-httpd
# 验证容器已删除
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4.2 部署数据库容器
4.2.1 运行MySQL容器
$ podman run -d -p 3306:3306 –name fgedu-mysql \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
docker.io/library/mysql:8.0
# 查看容器状态
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9876543210ab docker.io/library/mysql:8.0 mysqld 5 minutes ago Up 5 minutes ago 0.0.0.0:3306->3306/tcp fgedu-mysql
4.2.2 测试MySQL容器
$ podman exec -it fgedu-mysql mysql -u fgedu -pfgedu123
# 创建表
mysql> CREATE TABLE fgedu_users (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50),
-> email VARCHAR(100)
-> );
# 插入数据
mysql> INSERT INTO fgedu_users (name, email) VALUES (‘fgedu01’, ‘fgedu01@fgedu.net.cn’);
# 查询数据
mysql> SELECT * FROM fgedu_users;
+—-+——–+———————-+
| id | name | email |
+—-+——–+———————-+
| 1 | fgedu01 | fgedu01@fgedu.net.cn |
+—-+——–+———————-+
4.3 容器监控
4.3.1 监控容器资源使用情况
$ podman stats fgedu-mysql
ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS
9876543210ab fgedu-mysql 0.50% 256.0MB / 16.0GB 1.60% 1.2MB / 512.0KB 0B / 0B 28
Part05-风哥经验总结与分享
5.1 最佳实践
Podman在生产环境中的最佳实践:
- 使用官方镜像:尽量使用官方镜像,确保安全性和稳定性
- 定期更新镜像:及时更新镜像,修复安全漏洞
- 使用标签:使用固定标签,避免使用latest标签
- 资源限制:为容器设置资源限制,避免资源争用
- 数据持久化:使用卷或绑定挂载,确保数据持久化
- 网络配置:根据需求选择合适的网络模式
- 日志管理:配置日志收集和管理
- 安全加固:使用非root用户运行容器,限制容器权限
5.2 常见问题与解决方案
Podman在生产环境中常见的问题与解决方案:
## 问题1:容器无法启动
# 解决方案:
– 检查镜像是否存在
– 检查端口是否被占用
– 检查资源是否足够
– 查看容器日志
## 问题2:容器网络连接问题
# 解决方案:
– 检查网络配置
– 检查防火墙规则
– 检查DNS配置
– 使用podman network inspect查看网络详情
## 问题3:容器数据丢失
# 解决方案:
– 使用卷或绑定挂载
– 定期备份数据
– 实现数据持久化策略
## 问题4:权限问题
# 解决方案:
– 使用正确的用户权限
– 配置适当的文件权限
– 使用rootless容器
5.3 学习资源推荐
Podman学习资源推荐:
- 官方文档:https://podman.io/docs
- Podman GitHub:https://github.com/containers/podman
- Podman教程:https://www.redhat.com/sysadmin/podman-basics
- 容器技术书籍:《容器技术实战》、《Kubernetes实战》
- 在线课程:Red Hat容器技术课程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
