docker变收费,使用podman平滑替代
根据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 的核心优势值得关注:
无守护进程设计
无需依赖dockerd
后台服务,直接通过命令与容器交互,减少资源占用和单点故障风险。更优的安全性
原生支持 rootless 模式(非 root 用户运行容器),降低权限滥用风险,兼容 SELinux 等安全机制。命令高度兼容
95% 以上的 Docker 命令可直接在 Podman 中使用,学习成本极低,现有脚本几乎无需修改。贴近云原生
内置对 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
命令,可设置别名:
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 基本一致。