根据Halo官方文档,使用docker快速部署可以执行以下命令:

docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 -e JVM_OPTS="-Xmx256m -Xms256m" registry.fit2cloud.com/halo/halo:2.21

在虚拟机上执行成功,并成功启动。

由于docker的一些限制,到达一定条件,docker官方需要收费,所以考虑使用podman平替docker。所以有了下面这个podman的命令:

podman run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 -e JVM_OPTS="-Xmx256m -Xms256m" registry.fit2cloud.com/halo/halo:2.21

在虚拟机上执行时报错:Error: error checking path "/root/.halo2": stat /root/.halo2: no such file or directory

问了AI之后,逐步解决了问题,本文以 CentOS 7 为例,详解从 Docker 到 Podman 的完整迁移流程,助你避开常见坑点。

一、为什么选择 Podman?

相比 Docker,Podman 的核心优势值得关注:

  1. 无守护进程设计
    无需依赖 dockerd 后台服务,直接通过命令与容器交互,减少资源占用和单点故障风险。

  2. 更优的安全性
    原生支持 rootless 模式(非 root 用户运行容器),降低权限滥用风险,兼容 SELinux 等安全机制。

  3. 命令高度兼容
    95% 以上的 Docker 命令可直接在 Podman 中使用,学习成本极低,现有脚本几乎无需修改。

  4. 贴近云原生
    内置对 Kubernetes Pod 的支持,可直接运行 Pod 定义文件,更适应云原生生态。

二、迁移前的准备工作

1. 环境检查与更新

确保系统为 CentOS 7 及以上,先更新系统包:

sudo yum update -y

2. 备份 Docker 数据

迁移前备份重要数据,避免丢失:

# 导出关键镜像
docker save -o ~/docker-images.tar nginx mysql

# 备份容器挂载数据(以 Halo 为例)
cp -r ~/.halo2 ~/.halo2-backup

三、迁移的核心步骤

步骤 1:卸载 Docker 组件

先清理现有 Docker 环境,避免冲突:

# 停止并禁用 Docker 服务
sudo systemctl stop docker
sudo systemctl disable docker

# 卸载 Docker 相关包
sudo yum remove -y docker-ce docker-ce-cli containerd.io

# 删除残留文件
sudo rm -rf /var/lib/docker /var/lib/containerd

步骤 2:安装 Podman

CentOS 7 官方源已包含 Podman,直接安装:

# 安装 Podman
sudo yum install -y podman

# 验证安装
podman --version  # 输出类似:podman version 4.4.1

步骤 3:配置镜像加速(国内用户必备)

编辑镜像源配置文件,提升拉取速度:

sudo vi /etc/containers/registries.conf

添加国内镜像源(如阿里云):

[registries.search]
registries = ['docker.io', 'registry.aliyuncs.com', 'quay.io']

# Docker Hub 镜像加速
[[registry]]
prefix = "docker.io"
location = "registry.aliyuncs.com/library"

步骤 4:迁移 Docker 命令习惯

Podman 与 Docker 命令兼容,常用命令直接替换即可:

Docker 命令

Podman 命令

说明

docker pull <镜像>

podman pull <镜像>

拉取镜像

docker run <参数>

podman run <参数>

启动容器

docker ps

podman ps

查看运行中容器

docker logs <容器>

podman logs <容器>

查看容器日志

docker rm <容器>

podman rm <容器>

删除容器

若习惯 docker 命令,可设置别名:

echo "alias docker='podman'" >> ~/.bashrc
source ~/.bashrc  # 立即生效

四、迁移后常见问题及解决方案

问题 1:挂载目录时报 “no such file or directory”

错误信息

Error: error checking path "/root/.halo2": stat /root/.halo2: no such file or directory

原因:Podman 要求宿主机挂载目录必须预先存在,不会自动创建。
解决:手动创建目录后重启容器:

mkdir -p ~/.halo2  # 创建目录
podman run -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 registry.fit2cloud.com/halo/halo:2.21

问题 2:容器无法写入宿主机目录(权限被拒)

现象:容器启动后,挂载目录未生成文件,日志显示 “permission denied”。
原因:CentOS 7 启用 SELinux 时,默认阻止容器写入宿主机目录。
解决:配置 SELinux 安全上下文:

检查 SELinux 限制(CentOS 7 常见问题)

CentOS 7 默认启用 SELinux,可能阻止容器写入宿主机目录,可临时关闭 SELinux 测试:

# 临时关闭 SELinux(立即生效,重启后恢复)
sudo setenforce 0

# 重新启动容器
podman restart halo

# 若问题解决,可永久配置 SELinux 规则(推荐):
sudo chcon -Rt svirt_sandbox_file_t ~/.halo2  # 允许容器访问该目录

# 验证配置(可选)
ls -Z ~/.halo2  # 输出应包含 "svirt_sandbox_file_t"

问题 3:容器端口无法访问

现象:容器已启动,但通过宿主机 IP 访问端口失败。
解决:检查端口映射并开放防火墙:

# 检查端口映射
podman inspect --format '{{.NetworkSettings.Ports}}' halo

# 开放防火墙端口
sudo firewall-cmd --add-port=8090/tcp --permanent
sudo firewall-cmd --reload

五、Podman 进阶技巧

1. 配置容器自启动

Podman 无守护进程,需通过 systemd 实现自启:

# 生成 systemd 服务文件
podman generate systemd --name halo --files

# 移动到系统服务目录
sudo mv container-halo.service /etc/systemd/system/

# 设置开机自启
sudo systemctl enable --now container-halo

2. 导入 Docker 备份的镜像

podman load -i ~/docker-images.tar  # 导入镜像

3. 使用 rootless 模式(增强安全性)

# 为普通用户配置子 UID/GID
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 your_username

# 切换用户并测试
su - your_username
podman run --rm hello-world  # 非 root 运行容器

六、总结

从 Docker 迁移到 Podman 是一个平滑过程,得益于命令兼容性,现有工作流几乎无需调整。Podman 的无守护进程设计和安全性优势,使其成为生产环境的理想选择。

迁移的核心是解决目录挂载权限SELinux 配置问题,掌握这些要点后,使用体验与 Docker 基本一致。