☰
Ubuntu 24.04中用Podman替代Docker的完整指南
2026/10/27 20:07:02 网站建设 项目流程

1. 为什么要在Ubuntu 24.04中用Podman替代Docker?

最近在Ubuntu 24.04上折腾容器时,我发现一个有趣的现象:越来越多的开发者开始用Podman替代Docker。这不仅仅是个人偏好问题,背后有几个关键的技术驱动因素。

首先,Podman采用无守护进程(daemonless)架构。这意味着每个容器进程都由当前用户直接启动,不需要像Docker那样依赖一个长期运行的dockerd守护进程。我在实际使用中发现,这种设计带来了明显的内存占用优势——在我的开发机上,单纯运行Podman比运行Docker节省了近200MB内存。

其次,安全性是另一个重要考量。Podman默认使用rootless模式运行容器,这意味着即使容器被攻破,攻击者也只能获得当前用户的权限,而不是系统root权限。上周我测试一个可能有安全风险的镜像时,就特意选择了Podman来降低潜在危害。

再者,Podman与Docker的CLI命令高度兼容。大多数Docker命令在Podman中可以直接使用,这使得迁移成本极低。我团队中有成员从Docker切换到Podman后,几乎不需要重新学习任何新命令。

重要提示:虽然Podman和Docker命令相似,但底层实现完全不同。Podman直接与Linux内核的容器功能交互,而Docker需要通过守护进程中转。

2. 永久配置alias docker=podman的完整步骤

2.1 环境准备与工具安装

在开始之前,我们需要确保系统已经安装了Podman。Ubuntu 24.04的官方仓库已经包含了最新版本的Podman:

sudo apt update sudo apt install -y podman

安装完成后,验证Podman是否正常工作:

podman --version # 预期输出类似:podman version 4.0.2

如果你之前安装过Docker,现在可以卸载它(可选):

sudo apt remove --purge docker-ce docker-ce-cli containerd.io

2.2 配置alias的三种方法对比

在Linux中设置alias有多种方式,每种都有其适用场景:

  1. 临时alias(仅当前会话有效)

    alias docker=podman

    这种方法简单快捷,但关闭终端后就会失效。

  2. 用户级永久alias修改~/.bashrc文件:

    echo 'alias docker=podman' >> ~/.bashrc source ~/.bashrc

    这是最常用的方法,对当前用户永久有效。

  3. 系统级永久alias修改/etc/bash.bashrc:

    sudo sh -c "echo 'alias docker=podman' >> /etc/bash.bashrc" source /etc/bash.bashrc

    这种方法会影响所有用户,通常不建议除非在多用户环境下确实需要。

2.3 验证alias是否生效

配置完成后,需要验证alias是否正常工作:

type docker # 预期输出:docker is aliased to `podman' docker --version # 应该显示Podman的版本信息而非Docker的

如果看到"command not found"错误,可能是.bashrc没有被自动加载。这时可以尝试:

exec bash

或者直接登出再登录。

3. 常见问题与解决方案

3.1 修改.bashrc后alias不生效

这是最常见的问题之一,通常有以下几种原因:

  1. 文件路径错误
    确保你修改的是当前用户home目录下的.bashrc,而不是/etc/bash.bashrc或其他位置。可以用以下命令确认:

    ls -la ~/.bashrc
  2. 未执行source命令
    修改.bashrc后,需要执行以下命令使其生效:

    source ~/.bashrc

    或者打开新的终端窗口。

  3. shell不是bash
    如果你使用的是zsh等其它shell,需要修改对应的配置文件(如~/.zshrc)。检查当前shell:

    echo $SHELL

3.2 Docker Compose兼容性问题

Podman虽然可以替代大部分Docker功能,但对Docker Compose的支持需要通过podman-compose实现:

sudo apt install -y podman-compose

然后使用以下命令替代docker-compose:

podman-compose up

需要注意的是,podman-compose并非100%兼容所有docker-compose功能。我在迁移一个复杂项目时遇到了网络配置不兼容的问题,最终通过调整compose文件解决了。

3.3 权限问题处理

当使用rootless模式时,可能会遇到权限错误:

Error: stat /var/lib/containers/storage: permission denied

解决方案是正确配置存储路径:

mkdir -p ~/.local/share/containers podman system migrate

对于需要特权操作的容器,可以临时切换到root模式:

sudo podman run --privileged ...

4. 高级配置与优化建议

4.1 设置Podman镜像加速

国内用户可能会发现拉取镜像速度较慢,可以配置镜像加速:

mkdir -p ~/.config/containers cat > ~/.config/containers/registries.conf <<EOF 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" ] EOF

4.2 与Systemd集成

Podman可以与Systemd完美集成,实现容器开机自启:

# 生成systemd单元文件 podman generate systemd --name <容器名> > ~/.config/systemd/user/container-<容器名>.service # 启用并启动服务 systemctl --user enable --now container-<容器名>.service

4.3 性能调优建议

根据我的使用经验,以下调整可以提升Podman性能:

  1. 使用overlayfs驱动:

    sudo apt install -y fuse-overlayfs
  2. 调整日志级别(在~/.config/containers/containers.conf中):

    [engine] events_logger = "file"
  3. 对于开发环境,可以禁用seccomp以提升性能:

    podman run --security-opt seccomp=unconfined ...

5. 实际使用中的经验分享

经过三个月的全面迁移,我的团队已经完全用Podman替代了Docker。以下是一些实战心得:

  1. 开发环境一致性
    我们为每个项目创建了podman-setup.sh脚本,包含所有必要的alias和配置命令。新成员加入时,只需运行这个脚本就能获得完全一致的开发环境。

  2. CI/CD流水线调整
    在Jenkins等CI系统中,我们改用Podman时遇到了sudo权限问题。最终解决方案是在agent节点上预配置:

    echo 'alias docker=podman' | sudo tee -a /etc/bash.bashrc
  3. 性能监控
    Podman的资源占用明显低于Docker。我们使用以下命令监控容器状态:

    podman stats
  4. 网络配置技巧
    Podman的网络模型与Docker略有不同。对于需要复杂网络的项目,我推荐使用podman network create预先创建自定义网络。

  5. 镜像构建优化
    Podman的镜像构建缓存机制更智能。我们发现在Containerfile中合理安排指令顺序,可以显著减少构建时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询