本文档风哥主要介绍Podman的rootless容器管理,包括rootless容器的概念、优势、要求以及rootless容器的设置、操作和网络等内容。风哥教程参考Podman官方文档Rootless Containers部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Rootless容器概念
Rootless容器是指在非root用户权限下运行的容器。传统的容器需要root权限才能运行,因为它们需要访问系统资源和创建网络命名空间等操作。而rootless容器通过使用用户命名空间(user namespace)等技术,允许普通用户在不需要root权限的情况下运行容器。更多视频教程www.fgedu.net.cn
- 不需要root权限:普通用户即可运行容器
- 安全隔离:容器运行在用户命名空间中,与主机系统隔离
- 权限限制:容器内的root权限被映射到主机上的普通用户权限
- 资源限制:受限于用户的资源配额
1.2 Rootless容器优势
Rootless容器具有以下优势:
- 安全性:减少了容器对主机系统的影响,降低了安全风险
- 隔离性:每个用户可以运行自己的容器,相互隔离
- 可管理性:不需要root权限,便于普通用户使用
- 兼容性:与传统容器兼容,支持大多数容器操作
1.3 Rootless容器要求
运行rootless容器需要满足以下要求:
- 操作系统支持:Linux内核版本4.18或更高
- 用户命名空间:内核启用用户命名空间
- uid/gid映射:用户需要有足够的uid和gid映射
- 依赖项:需要安装slirp4netns和fuse-overlayfs等依赖
Part02-生产环境规划与建议
2.1 Rootless容器设计
生产环境中Podman的rootless容器设计:
## 用户规划
– 为每个应用创建专用的用户
– 合理分配用户的uid和gid范围
– 避免使用系统用户运行容器
## 资源规划
– 为每个用户设置资源限制
– 考虑容器的CPU、内存和磁盘需求
– 监控用户的资源使用情况
## 网络规划
– 使用slirp4netns进行网络隔离
– 配置端口映射
– 考虑网络性能和安全性
## 存储规划
– 为用户配置适当的存储位置
– 使用卷或绑定挂载进行数据持久化
– 确保用户对存储有适当的权限
2.2 Rootless容器安全
生产环境中Podman的rootless容器安全考虑:
## 镜像安全
– 使用官方镜像或可信来源的镜像
– 定期扫描镜像中的安全漏洞
– 及时更新镜像
## 容器隔离
– 使用用户命名空间进行隔离
– 限制容器的权限和能力
– 配置适当的SELinux设置
– 使用网络隔离
## 数据安全
– 保护容器数据
– 定期备份数据
– 加密敏感数据
## 运行时安全
– 监控容器的运行状态
– 检测异常行为
– 配置适当的防火墙规则
2.3 Rootless容器性能
生产环境中Podman的rootless容器性能优化:
- 网络性能:使用slirp4netns可能会影响网络性能,可考虑使用更高效的网络方案
- 存储性能:使用fuse-overlayfs可能会影响存储性能,可考虑使用更高效的存储方案
- 资源限制:合理设置用户的资源限制,避免资源争用
- 启动速度:rootless容器的启动速度可能会比传统容器慢,可考虑优化启动过程
Part03-生产环境项目实施方案
3.1 Rootless容器设置
3.1.1 安装依赖项
$ sudo dnf install -y slirp4netns fuse-overlayfs
# 输出日志
Last metadata expiration check: 1:00:00 ago on Mon Apr 10 10:00:00 2026.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
fuse-overlayfs x86_64 1.10.0-1.el9 appstream 120 k
slirp4netns x86_64 1.2.0-1.el9 appstream 65 k
Transaction Summary
================================================================================
Install 2 Packages
Total download size: 185 k
Installed size: 448 k
Downloading Packages:
[SKIPPED] fuse-overlayfs-1.10.0-1.el9.x86_64.rpm: Already downloaded
[SKIPPED] slirp4netns-1.2.0-1.el9.x86_64.rpm: Already downloaded
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : slirp4netns-1.2.0-1.el9.x86_64 1/2
Installing : fuse-overlayfs-1.10.0-1.el9.x86_64 2/2
Running scriptlet: fuse-overlayfs-1.10.0-1.el9.x86_64 2/2
Verifying : fuse-overlayfs-1.10.0-1.el9.x86_64 1/2
Verifying : slirp4netns-1.2.0-1.el9.x86_64 2/2
Installed:
fuse-overlayfs-1.10.0-1.el9.x86_64 slirp4netns-1.2.0-1.el9.x86_64
Complete!
3.1.2 配置用户命名空间
$ sysctl kernel.unprivileged_userns_clone
# 输出日志
kernel.unprivileged_userns_clone = 1
# 配置用户uid/gid映射
$ echo “fgedu:100000:65536” > /etc/subuid
$ echo “fgedu:100000:65536” > /etc/subgid
# 切换到普通用户
$ su – fgedu
# 初始化rootless容器
$ podman system migrate
# 输出日志
no configuration changes necessary
3.2 Rootless容器操作
3.2.1 运行rootless容器
$ 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.2.2 管理rootless容器
$ podman stop fgedu-httpd
# 输出日志
fgedu-httpd
# 启动容器
$ podman start fgedu-httpd
# 输出日志
fgedu-httpd
# 删除容器
$ podman rm fgedu-httpd
# 输出日志
fgedu-httpd
# 查看所有容器
$ podman ps -a
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.3 Rootless容器网络
3.3.1 配置rootless容器网络
$ podman network ls
# 输出日志
NETWORK ID NAME DRIVER
1234567890ab bridge bridge
9876543210ab host host
5678901234ab none null
# 创建自定义网络
$ podman network create fgedu-network
# 输出日志
f45678901234
# 在自定义网络中运行容器
$ podman run -d –network fgedu-network –name fgedu-nginx docker.io/library/nginx
# 输出日志
6543217890ab
# 测试容器间通信
$ podman exec fgedu-nginx ping fgedu-httpd
# 输出日志
PING fgedu-httpd (10.88.0.2): 56 data bytes
64 bytes from 10.88.0.2: seq=0 ttl=64 time=0.1 ms
64 bytes from 10.88.0.2: seq=1 ttl=64 time=0.1 ms
64 bytes from 10.88.0.2: seq=2 ttl=64 time=0.1 ms
Part04-生产案例与实战讲解
4.1 Rootless Web容器
4.1.1 部署Rootless Web容器
# 切换到普通用户
$ su – fgedu
# 创建数据目录
$ mkdir -p /home/fgedu/data/html
# 运行Nginx容器
$ podman run -d -p 80:80/tcp –name fgedu-nginx \
-v /home/fgedu/data/html:/usr/share/nginx/html:z \
docker.io/library/nginx
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/nginx nginx -g daemon 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp fgedu-nginx
# 测试Web服务
$ echo “
Hello from Rootless Container!
” > /home/fgedu/data/html/index.html
$ curl http://localhost
# 输出日志
Hello from Rootless Container!
4.2 Rootless数据库容器
4.2.1 部署Rootless数据库容器
# 切换到普通用户
$ su – fgedu
# 创建数据目录
$ mkdir -p /home/fgedu/data/mysql
# 运行MySQL容器
$ podman run -d -p 3306:3306 –name fgedu-mysql \
-v /home/fgedu/data/mysql:/var/lib/mysql:z \
-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
# 测试数据库连接
$ podman exec fgedu-mysql mysql -u fgedu -p fgedudb -e “CREATE TABLE fgedu_users (id INT PRIMARY KEY, name VARCHAR(255));”
# 输出日志
Enter password:
# 查看表结构
$ podman exec fgedu-mysql mysql -u fgedu -p fgedudb -e “SHOW TABLES;”
# 输出日志
Enter password:
+——————+
| Tables_in_fgedudb |
+——————+
| fgedu_users |
+——————+
4.3 Rootless应用容器
4.3.1 部署Rootless应用容器
# 切换到普通用户
$ su – fgedu
# 创建应用目录
$ mkdir -p /home/fgedu/data/app
# 运行应用容器
$ podman run -d -p 8000:8000 –name fgedu-app \
-v /home/fgedu/data/app:/app/data:z \
fgedu/app:latest
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1234567890ab fgedu/app:latest /app/run.sh 2 minutes ago Up 2 minutes ago 0.0.0.0:8000->8000/tcp fgedu-app
# 测试应用
$ curl http://localhost:8000
# 输出日志
Hello from Rootless Application!
Part05-风哥经验总结与分享
5.1 Rootless容器最佳实践
Podman Rootless容器的最佳实践:
- 使用专用用户:为每个应用创建专用的用户,避免使用系统用户
- 合理配置uid/gid映射:确保用户有足够的uid和gid范围
- 安装必要的依赖:确保安装了slirp4netns和fuse-overlayfs等依赖
- 设置资源限制:为用户设置合理的资源限制,避免资源争用
- 使用卷进行数据持久化:使用卷或绑定挂载进行数据持久化
- 配置网络:合理配置网络,考虑网络性能和安全性
- 监控容器:监控容器的运行状态和资源使用情况
- 定期清理:定期清理无用的容器和镜像,释放资源
5.2 常见问题与解决方案
Podman Rootless容器管理中的常见问题与解决方案:
## 问题1:无法运行rootless容器
# 解决方案:
– 检查内核版本是否支持用户命名空间
– 检查用户是否有uid/gid映射
– 安装必要的依赖:slirp4netns和fuse-overlayfs
– 运行podman system migrate初始化
## 问题2:网络性能问题
# 解决方案:
– 调整slirp4netns的配置
– 考虑使用更高效的网络方案
– 避免大量网络IO操作
## 问题3:存储权限问题
# 解决方案:
– 确保用户对存储目录有适当的权限
– 使用卷而不是绑定挂载
– 配置SELinux上下文
## 问题4:资源限制问题
# 解决方案:
– 为用户设置合理的资源限制
– 监控用户的资源使用情况
– 优化应用,减少资源使用
## 问题5:端口绑定问题
# 解决方案:
– 确保端口未被占用
– 使用非特权端口(大于1024)
– 配置端口映射
5.3 故障排查
Podman Rootless容器管理的故障排查:
## 容器启动失败
– 查看容器日志:podman logs
– 检查用户权限:id
– 检查uid/gid映射:cat /etc/subuid /etc/subgid
– 检查依赖项:rpm -qa | grep slirp4netns fuse-overlayfs
## 网络问题
– 检查网络配置:podman network inspect
– 测试网络连接:podman exec
– 检查slirp4netns状态:ps aux | grep slirp4netns
– 检查端口映射:podman port
## 存储问题
– 检查磁盘空间:df -h
– 检查文件权限:ls -la
– 检查SELinux状态:sudo sestatus
– 检查存储配置:cat ~/.config/containers/storage.conf
## 资源问题
– 查看资源使用:podman stats
– 检查用户资源限制:ulimit -a
– 检查系统资源:free -h, top
## 权限问题
– 检查用户权限:id
– 检查文件权限:ls -la
– 检查容器权限:podman inspect
– 配置SELinux上下文:chcon -Rt svirt_sandbox_file_t
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
