当前位置: 首页 > news >正文

Ubuntu系统下Podman的安装与容器管理实战指南

1. 为什么选择Podman?

如果你正在寻找一个轻量级、无需守护进程的容器工具,Podman绝对值得考虑。我在实际项目中从Docker切换到Podman后,发现它不仅能完美兼容Docker命令,还解决了权限管理和安全方面的痛点。特别是在Ubuntu这样的Linux系统上,Podman能更自然地融入系统生态。

与Docker不同,Podman采用无守护进程架构,这意味着即使podman进程崩溃,你的容器也不会受到影响。我在一次服务器异常断电时就深刻体会到了这个优势——所有业务容器都安然无恙。另外,Podman默认使用普通用户权限运行容器,这种"rootless"模式大幅降低了安全风险。

2. 安装前的准备工作

2.1 系统要求检查

在开始安装前,建议先确认你的Ubuntu版本。我推荐使用20.04 LTS或更高版本,这些版本对Podman的支持更完善。可以通过以下命令查看系统信息:

lsb_release -a

内存方面,至少需要2GB RAM才能流畅运行容器。如果是生产环境,建议4GB以上。我曾经在1GB内存的测试机上遇到容器频繁崩溃的情况,升级配置后问题立即解决。

2.2 更新系统基础环境

安装前务必更新系统,这能避免很多依赖问题。我习惯先执行以下命令:

sudo apt update && sudo apt upgrade -y

有时候会遇到旧内核导致的问题,所以最好也重启一次:

sudo reboot

3. 安装Podman的三种方法

3.1 通过官方仓库安装

这是最推荐的方式,能保证获取最新稳定版。首先添加Podman官方仓库:

source /etc/os-release echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

然后导入GPG密钥:

curl -L "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key" | sudo apt-key add -

最后安装Podman:

sudo apt update && sudo apt install podman -y

3.2 使用Snap安装

如果你偏好Snap包管理,可以这样安装:

sudo snap install podman --classic

不过要注意,Snap版本的更新可能滞后于官方仓库。我在测试环境中发现过某些新特性在Snap版本中不可用的情况。

3.3 从源码编译安装

适合需要定制化的高级用户。先安装依赖:

sudo apt install -y git make golang-go runc

然后克隆源码并编译:

git clone https://github.com/containers/podman.git cd podman make BUILDTAGS="selinux seccomp" sudo make install

这种方式耗时较长,我曾在老款笔记本上花了近1小时才完成编译。

4. 关键配置与调优

4.1 配置cgroups v2

Podman需要cgroups v2支持。编辑GRUB配置:

sudo nano /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT行,添加:

systemd.unified_cgroup_hierarchy=1

更新GRUB并重启:

sudo update-grub && sudo reboot

验证是否生效:

cat /sys/fs/cgroup/cgroup.controllers

如果看到一串控制器列表,说明配置成功。我遇到过配置不生效的情况,最后发现是BIOS中虚拟化支持没开启。

4.2 存储驱动优化

Podman默认使用overlay存储驱动。如果你使用SSD,建议调整为更高效的vfs:

sudo nano /etc/containers/storage.conf

修改以下参数:

driver = "vfs"

这个调整让我的容器启动速度提升了约30%,特别是在批量创建容器时效果明显。

5. 容器生命周期管理实战

5.1 运行第一个容器

尝试运行一个Ubuntu容器:

podman run -it --name my_ubuntu ubuntu bash

参数说明:

  • -it:交互式终端
  • --name:指定容器名称
  • ubuntu:镜像名称
  • bash:启动命令

退出容器后,可以用podman start -ai my_ubuntu重新进入。我经常用这个方式创建临时测试环境。

5.2 容器网络配置

创建一个带端口映射的Nginx容器:

podman run -d -p 8080:80 --name my_nginx nginx

查看容器IP:

podman inspect my_nginx | grep IPAddress

创建自定义网络:

podman network create mynet podman run -d --network mynet --name web1 nginx podman run -d --network mynet --name web2 nginx

这样web1和web2就能通过容器名互相访问了。我在微服务测试中经常使用这种网络隔离方案。

6. 镜像管理技巧

6.1 加速镜像拉取

编辑配置文件:

sudo nano /etc/containers/registries.conf

添加国内镜像源:

unqualified-search-registries = ['docker.io'] [[registry]] prefix = "docker.io" location = "registry-1.docker.io" mirror = [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ]

这个配置让我的镜像下载速度从50KB/s提升到了5MB/s。

6.2 构建自定义镜像

准备一个简单的Dockerfile:

FROM alpine RUN apk add --no-cache curl CMD ["curl", "--version"]

构建镜像:

podman build -t my-curl .

测试运行:

podman run --rm my-curl

我建议为常用工具都构建这样的轻量级镜像,比每次安装方便多了。

7. 高级运维技巧

7.1 容器资源限制

限制容器内存为512MB:

podman run -it --memory=512m ubuntu bash

限制CPU使用:

podman run -it --cpus=1.5 ubuntu bash

查看资源使用情况:

podman stats

这些限制在生产环境中特别重要。我曾经因为没限制内存导致一个容器吃光了服务器资源。

7.2 容器持久化存储

创建数据卷:

podman volume create mydata

挂载到容器:

podman run -it -v mydata:/data ubuntu bash

在容器内创建的文件会永久保存在卷中。对于数据库容器,这是必须的配置。

8. 常见问题排查

8.1 权限问题解决

普通用户运行容器时可能遇到权限错误。先检查subuid/subgid配置:

sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

然后重新登录。我在多用户环境中经常需要调整这个配置。

8.2 容器网络不通

检查防火墙规则:

sudo iptables -L

有时需要手动放行端口:

sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload

特别是在使用非标准端口时,这个问题很容易被忽视。

http://www.cnnetsun.cn/news/1444979.html

相关文章:

  • SAP 批量处理分包事后调整:BAPI_GOODSMVT_CREATE 关键参数与避坑指南
  • 树莓派网络自治:实现开机自连与断网自愈的完整方案
  • ComfyUI图像筛选神器:cg-image-picker插件5分钟上手教程(附避坑指南)
  • HY-MT1.5-1.8B新手入门:一键部署33种语言翻译,效果媲美商业API
  • VLAN间通信方案对比:为什么小型网络首选路由器物理接口方案?
  • 天翼云监控实战:如何用GB28181设备快速搭建企业级安防系统(含配置模板)
  • 变频器干扰实战:从PLC误动作到信号失真的5种快速排查方法
  • C#实战:海康工业相机SDK开发避坑指南(从枚举设备到图像采集全流程)
  • Audio Pixel StudioStreamlit性能压测:10并发TTS请求响应时间与稳定性
  • Windows 10终极优化指南:如何一键禁用无用服务并提升30%系统性能
  • YOLO12开源模型安全审计:ONNX导出漏洞扫描+TVM编译器后门检测
  • 口袋里的AI助手:LFM2.5-1.2B-Thinking快速部署,内存不到1GB
  • Qwen3-VL-8B企业级Agent架构设计:构建多模态自动化工作流
  • STM32的‘数据保险箱’BKP怎么用?手把手教你用VBAT电池保存关键参数(附防拆设计思路)
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4与Node.js集成:构建全栈AI应用后端API
  • OpenCV图像特征提取:Harris角点检测与SIFT特征提取实战
  • 聊聊基于静态电压补偿法的永磁同步电机无感控制Simulink仿真模型
  • 使用Qwen3进行自动化作业批改与反馈生成实践
  • 深度解析:美国海外仓选址底层逻辑,东岸 vs 西岸该如何进行架构布局?
  • 嵌入式Linux移植TranslateGemma轻量化方案
  • SHT7x温湿度传感器驱动开发与精准时序控制
  • Win11Debloat:Windows 11终极优化指南 - 一键清理系统垃圾,提升性能与隐私保护
  • Fun-ASR-MLT-Nano-2512部署教程:修复model.py初始化bug后的稳定推理方案
  • 从零搭建AI算力中心:英伟达GPU选型指南与实战配置
  • BurpSuite+SqlMap联动实战:5分钟搞定SQL注入自动化检测(附避坑指南)
  • STLink工具链升级全指南:从v1.7.0到v1.8.0的技术跃迁
  • PDF-Extract-Kit-1.0实操手册:/root/PDF-Extract-Kit目录下各sh脚本功能对比
  • 优选算法_分治_快速排序_归并排序_C++
  • 2023-阿里云云效Maven私有仓库实战:快速部署团队共享Jar包
  • MedGemma Medical Vision Lab实际作品:教学PPT嵌入式影像问答交互截图集