本文档风哥主要介绍Podman容器存储管理进阶,包括存储的概念、类型、存储驱动以及卷管理、绑定挂载和tmpfs挂载等内容。风哥教程参考Podman官方文档Storage部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 存储概念
容器存储是指容器使用的存储资源,包括容器镜像存储、容器数据存储等。Podman容器存储是指Podman容器使用的存储资源,包括容器镜像存储、容器数据存储、卷存储等。更多视频教程www.fgedu.net.cn
- 持久化数据:保存容器中的数据,即使容器停止或删除
- 共享数据:在多个容器之间共享数据
- 配置管理:存储容器的配置文件
- 日志存储:存储容器的日志文件
- 应用数据:存储应用程序的数据
1.2 存储类型
Podman容器存储的类型主要包括:
- 镜像存储:存储容器镜像的存储
- 容器存储:存储容器数据的存储
- 卷存储:持久化存储容器数据的存储
- 绑定挂载:将主机目录挂载到容器中的存储
- tmpfs挂载:使用内存作为存储的临时存储
1.3 存储驱动
Podman容器的存储驱动主要包括:
- overlay2:基于OverlayFS的存储驱动,适用于大多数Linux发行版
- btrfs:基于Btrfs文件系统的存储驱动,适用于支持Btrfs的系统
- zfs:基于ZFS文件系统的存储驱动,适用于支持ZFS的系统
- devicemapper:基于Device Mapper的存储驱动,适用于所有Linux发行版
- vfs:基于VFS的存储驱动,适用于所有Linux发行版,性能较低
Part02-生产环境规划与建议
2.1 存储策略
生产环境中Podman的存储策略:
## 数据持久化
– 使用卷:使用卷存储容器数据,确保数据持久化
– 使用绑定挂载:将主机目录挂载到容器中,确保数据持久化
– 定期备份:定期备份容器数据,确保数据安全
## 存储优化
– 选择合适的存储驱动:根据系统环境选择合适的存储驱动
– 优化存储配置:调整存储配置,提高存储性能
– 使用高速存储:使用SSD等高速存储设备,提高存储性能
## 存储管理
– 定期清理:定期清理无用的镜像和容器,释放存储空间
– 监控存储使用:监控存储使用情况,及时发现存储问题
– 存储扩展:根据业务需求,扩展存储容量
## 存储安全
– 访问控制:限制存储的访问权限,确保数据安全
– 加密存储:加密存储敏感数据,确保数据安全
– 备份策略:制定完善的备份策略,确保数据可恢复
2.2 存储需求
生产环境中Podman的存储需求:
## 功能需求
– 数据持久化:确保容器数据的持久化存储
– 数据共享:支持在多个容器之间共享数据
– 数据备份:支持容器数据的备份和恢复
– 存储扩展:支持存储容量的扩展
## 性能需求
– 读写性能:满足应用的读写性能要求
– 响应时间:确保存储操作的响应时间
– 并发性能:支持多容器并发访问存储
– 可靠性:确保存储的可靠性和稳定性
## 技术需求
– 存储驱动:支持多种存储驱动
– 存储类型:支持多种存储类型
– 存储管理:提供存储管理工具
– 监控告警:提供存储监控和告警功能
## 非功能需求
– 可靠性:确保存储的可靠性和稳定性
– 安全性:确保存储的安全性
– 可维护性:便于管理和维护存储
– 成本效益:合理的存储成本
2.3 存储优化
生产环境中Podman的存储优化:
- 选择合适的存储驱动:根据系统环境选择合适的存储驱动,如overlay2、btrfs等
- 优化存储配置:调整存储配置,如调整overlay2的挂载选项,提高存储性能
- 使用高速存储:使用SSD等高速存储设备,提高存储性能
- 合理使用卷:合理使用卷存储容器数据,提高数据管理效率
- 定期清理:定期清理无用的镜像和容器,释放存储空间
Part03-生产环境项目实施方案
3.1 卷管理
3.1.1 卷的创建和管理
# 创建卷
$ podman volume create fgedu-volume
# 查看卷
$ podman volume ls
# 输出日志
DRIVER VOLUME NAME
local fgedu-volume
# 查看卷详情
$ podman volume inspect fgedu-volume
# 输出日志
[
{
“Name”: “fgedu-volume”,
“Driver”: “local”,
“Mountpoint”: “/var/lib/containers/storage/volumes/fgedu-volume/_data”,
“CreatedAt”: “2026-04-10T10:00:00+08:00”,
“Labels”: {},
“Scope”: “local”,
“Options”: {},
“MountCount”: 0,
“NeedsChown”: false
}
]
# 使用卷运行容器
$ podman run -d –name fgedu-nginx \
-v fgedu-volume:/usr/share/nginx/html:z \
-p 80:80 \
docker.io/library/nginx
# 查看卷的使用情况
$ podman volume inspect fgedu-volume
# 输出日志
[
{
“Name”: “fgedu-volume”,
“Driver”: “local”,
“Mountpoint”: “/var/lib/containers/storage/volumes/fgedu-volume/_data”,
“CreatedAt”: “2026-04-10T10:00:00+08:00”,
“Labels”: {},
“Scope”: “local”,
“Options”: {},
“MountCount”: 1,
“NeedsChown”: false
}
]
# 删除卷
$ podman volume rm fgedu-volume
# 清理未使用的卷
$ podman volume prune
# 输出日志
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleting unused volumes: fgedu-volume
Deleted Volumes: fgedu-volume
Total reclaimed space: 1.0MB
3.2 绑定挂载
3.2.1 绑定挂载的使用
# 创建主机目录
$ mkdir -p /Podman/fgdata/nginx/html
# 运行容器,使用绑定挂载
$ podman run -d –name fgedu-nginx \
-v /Podman/fgdata/nginx/html:/usr/share/nginx/html:z \
-p 80:80 \
docker.io/library/nginx
# 查看容器挂载情况
$ podman inspect fgedu-nginx | grep -A 20 “Mounts”
# 输出日志
“Mounts”: [
{
“Type”: “bind”,
“Source”: “/Podman/fgdata/nginx/html”,
“Destination”: “/usr/share/nginx/html”,
“Mode”: “z”,
“RW”: true,
“Propagation”: “rprivate”
}
],
# 测试绑定挂载
$ echo “Hello from bind mount” > /Podman/fgdata/nginx/html/index.html
$ curl http://localhost
# 输出日志
Hello from bind mount
# 运行多个容器共享绑定挂载
$ podman run -d –name fgedu-nginx2 \
-v /Podman/fgdata/nginx/html:/usr/share/nginx/html:z \
-p 8080:80 \
docker.io/library/nginx
$ curl http://localhost:8080
# 输出日志
Hello from bind mount
3.3 tmpfs挂载
3.3.1 tmpfs挂载的使用
# 运行容器,使用tmpfs挂载
$ podman run -d –name fgedu-nginx \
–tmpfs /tmp:size=128m \
-p 80:80 \
docker.io/library/nginx
# 查看容器挂载情况
$ podman inspect fgedu-nginx | grep -A 20 “Mounts”
# 输出日志
“Mounts”: [
{
“Type”: “tmpfs”,
“Source”: “tmpfs”,
“Destination”: “/tmp”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
],
# 测试tmpfs挂载
$ podman exec -it fgedu-nginx sh
# 输出日志
# echo “Hello from tmpfs” > /tmp/test.txt
# cat /tmp/test.txt
Hello from tmpfs
# exit
# 停止容器
$ podman stop fgedu-nginx
# 启动容器
$ podman start fgedu-nginx
# 检查tmpfs中的数据
$ podman exec -it fgedu-nginx cat /tmp/test.txt
# 输出日志(数据已丢失)
cat: /tmp/test.txt: No such file or directory
Part04-生产案例与实战讲解
4.1 数据库存储
4.1.1 数据库存储实战
# 创建卷用于数据库存储
$ podman volume create fgedu-mysql-data
# 运行MySQL容器
$ podman run -d –name fgedu-mysql \
-v fgedu-mysql-data:/var/lib/mysql:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/mysql mysqld 2 minutes ago Up 2 minutes ago 0.0.0.0:3306->3306/tcp fgedu-mysql
# 测试数据库
$ podman exec -it fgedu-mysql mysql -u fgedu -p fgedudb
# 输出日志
Enter password:
mysql> CREATE TABLE fgedu_test (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(255),
-> value VARCHAR(255)
-> );
mysql> INSERT INTO fgedu_test (name, value) VALUES
-> (‘test1’, ‘value1’),
-> (‘test2’, ‘value2’),
-> (‘test3’, ‘value3’);
mysql> SELECT * FROM fgedu_test;
# 输出日志
+—-+——-+——–+
| id | name | value |
+—-+——-+——–+
| 1 | test1 | value1 |
| 2 | test2 | value2 |
| 3 | test3 | value3 |
+—-+——-+——–+
mysql> exit
# 停止并删除容器
$ podman stop fgedu-mysql
$ podman rm fgedu-mysql
# 重新运行容器,使用相同的卷
$ podman run -d –name fgedu-mysql \
-v fgedu-mysql-data:/var/lib/mysql:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 测试数据是否持久化
$ podman exec -it fgedu-mysql mysql -u fgedu -p fgedudb
# 输出日志
Enter password:
mysql> SELECT * FROM fgedu_test;
# 输出日志
+—-+——-+——–+
| id | name | value |
+—-+——-+——–+
| 1 | test1 | value1 |
| 2 | test2 | value2 |
| 3 | test3 | value3 |
+—-+——-+——–+
mysql> exit
4.2 应用存储
4.2.1 应用存储实战
# 创建主机目录用于应用存储
$ mkdir -p /Podman/fgdata/app
# 创建应用文件
$ cat > /Podman/fgdata/app/server.js << EOF
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
const port = 3000;
const dataPath = path.join(__dirname, 'data.json');
// 初始化数据
if (!fs.existsSync(dataPath)) {
fs.writeFileSync(dataPath, JSON.stringify({ users: [] }));
}
// 读取数据
app.get('/users', (req, res) => {
const data = JSON.parse(fs.readFileSync(dataPath, ‘utf8’));
res.json(data);
});
// 添加用户
app.post(‘/users’, (req, res) => {
const data = JSON.parse(fs.readFileSync(dataPath, ‘utf8’));
const newUser = { id: Date.now(), name: `User${Date.now()}` };
data.users.push(newUser);
fs.writeFileSync(dataPath, JSON.stringify(data));
res.json(newUser);
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
EOF
# 创建package.json
$ cat > /Podman/fgdata/app/package.json << EOF
{
"name": "node-app",
"version": "1.0.0",
"description": "Node.js application",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
EOF
# 运行Node.js容器
$ podman run -d --name fgedu-node \
-v /Podman/fgdata/app:/app:z \
-p 3000:3000 \
-w /app \
docker.io/library/node:18-alpine \
sh -c "npm install && npm start"
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/node sh -c npm install 2 minutes ago Up 2 minutes ago 0.0.0.0:3000->3000/tcp fgedu-node
# 测试应用
$ curl http://localhost:3000/users
# 输出日志
{“users”:[]}
# 添加用户
$ curl -X POST http://localhost:3000/users
# 输出日志
{“id”:1234567890123,”name”:”User1234567890123″}
# 查看数据
$ curl http://localhost:3000/users
# 输出日志
{“users”:[{“id”:1234567890123,”name”:”User1234567890123″}]}
# 检查主机目录中的数据
$ cat /Podman/fgdata/app/data.json
# 输出日志
{“users”:[{“id”:1234567890123,”name”:”User1234567890123″}]}
4.3 备份存储
4.3.1 备份存储实战
# 创建卷用于数据库存储
$ podman volume create fgedu-mysql-data
# 运行MySQL容器
$ podman run -d –name fgedu-mysql \
-v fgedu-mysql-data:/var/lib/mysql:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 测试数据库
$ podman exec -it fgedu-mysql mysql -u fgedu -p fgedudb
# 输出日志
Enter password:
mysql> CREATE TABLE fgedu_test (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(255),
-> value VARCHAR(255)
-> );
mysql> INSERT INTO fgedu_test (name, value) VALUES
-> (‘test1’, ‘value1’),
-> (‘test2’, ‘value2’),
-> (‘test3’, ‘value3’);
mysql> SELECT * FROM fgedu_test;
# 输出日志
+—-+——-+——–+
| id | name | value |
+—-+——-+——–+
| 1 | test1 | value1 |
| 2 | test2 | value2 |
| 3 | test3 | value3 |
+—-+——-+——–+
mysql> exit
# 停止容器
$ podman stop fgedu-mysql
# 备份卷数据
$ podman run –rm \
-v fgedu-mysql-data:/source:z \
-v /Podman/fgdata/backup:/backup:z \
docker.io/library/alpine \
tar -czf /backup/mysql-backup-$(date +%Y%m%d).tar.gz -C /source .
# 查看备份文件
$ ls -la /Podman/fgdata/backup/
# 输出日志
total 10240
-rw-r–r– 1 root root 10485760 Apr 10 10:00 mysql-backup-20260410.tar.gz
# 删除卷
$ podman volume rm fgedu-mysql-data
# 重新创建卷
$ podman volume create fgedu-mysql-data
# 恢复备份
$ podman run –rm \
-v fgedu-mysql-data:/destination:z \
-v /Podman/fgdata/backup:/backup:z \
docker.io/library/alpine \
tar -xzf /backup/mysql-backup-20260410.tar.gz -C /destination
# 重新运行容器
$ podman run -d –name fgedu-mysql \
-v fgedu-mysql-data:/var/lib/mysql:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-e MYSQL_DATABASE=fgedudb \
-e MYSQL_USER=fgedu \
-e MYSQL_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 测试数据是否恢复
$ podman exec -it fgedu-mysql mysql -u fgedu -p fgedudb
# 输出日志
Enter password:
mysql> SELECT * FROM fgedu_test;
# 输出日志
+—-+——-+——–+
| id | name | value |
+—-+——-+——–+
| 1 | test1 | value1 |
| 2 | test2 | value2 |
| 3 | test3 | value3 |
+—-+——-+——–+
mysql> exit
Part05-风哥经验总结与分享
5.1 存储管理最佳实践
Podman容器存储管理的最佳实践:
- 数据持久化:使用卷或绑定挂载存储容器数据,确保数据持久化
- 存储隔离:为不同的应用使用不同的存储,提高数据管理效率
- 定期备份:定期备份容器数据,确保数据安全
- 存储优化:选择合适的存储驱动和配置,提高存储性能
- 监控管理:监控存储使用情况,及时发现和解决存储问题
- 安全管理:限制存储的访问权限,加密存储敏感数据
- 清理维护:定期清理无用的镜像和容器,释放存储空间
- 文档记录:记录存储配置和管理流程,便于维护和追溯
5.2 存储性能优化
Podman容器存储的性能优化:
## 存储驱动优化
– 选择合适的存储驱动:根据系统环境选择合适的存储驱动
– 调整存储驱动配置:优化存储驱动的配置参数
– 使用overlay2:优先使用overlay2存储驱动,性能较好
## 存储设备优化
– 使用SSD:使用SSD等高速存储设备,提高存储性能
– 配置RAID:使用RAID提高存储性能和可靠性
– 优化文件系统:选择合适的文件系统,如ext4、xfs等
## 存储配置优化
– 调整挂载选项:优化存储的挂载选项,如noatime、nodiratime等
– 调整I/O调度:优化I/O调度算法,提高I/O性能
– 增加缓存:增加存储缓存,提高读写性能
## 应用优化
– 合理使用存储:避免频繁的I/O操作,减少存储压力
– 批量操作:使用批量操作,减少I/O次数
– 数据压缩:压缩存储数据,减少存储占用
– 数据分片:将大文件分片存储,提高读写性能
5.3 存储故障排查
Podman容器存储的故障排查:
## 存储挂载问题
– 检查挂载配置:podman inspect
– 检查主机目录:ls -la
– 检查权限:chown/chmod
– 检查存储驱动:podman info | grep -A 10 “Storage”
## 存储容量问题
– 检查存储使用:df -h
– 清理无用数据:podman system prune -a
– 扩展存储容量:增加存储设备或调整分区
– 检查日志:podman logs
## 存储性能问题
– 检查I/O性能:iostat
– 检查存储驱动:podman info | grep -A 10 “Storage”
– 优化存储配置:调整存储驱动和挂载选项
– 增加存储缓存:增加存储缓存,提高读写性能
## 存储数据问题
– 检查数据完整性:验证数据的完整性
– 恢复备份:使用备份恢复数据
– 检查文件系统:fsck检查文件系统
– 数据迁移:将数据迁移到新的存储设备
## 存储安全问题
– 检查访问权限:ls -la
– 检查加密配置:查看存储加密配置
– 加强访问控制:限制存储的访问权限
– 审计存储操作:记录存储的访问和操作
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
