适用系统:RHEL / CentOS / 麒麟 / Rocky / AlmaLinux 等一切 RPM 系发行版
目标:在一台内网服务器上,用 Podman 以非特权方式跑起 Gitea,并将其作为离线/隔离环境下的 Git 代码镜像与版本仓库,实现仓库数据的可迁移、可搬运。
一、为什么这样搭
- Podman 而非 Docker:RPM 系系统可免 root(允许 rootless 容器),命令与 Docker 兼容,
systemd原生托管容器。 - Gitea 单容器极轻:一个
gitea/gitea镜像即可包含 Web、Git 协议与数据库(默认 SQLite),适合中小团队。 - 离线 Git 镜像:把 Gitea 当作内网代码仓储中心,通过 Podman 数据卷的
export/import实现仓库在离线环境间的整体搬运,同时支持自行架设代理去公共源拉取项目做镜像。
二、前期准备:让 Podman 走代理拉取镜像(可选)
离线环境通常没有官方镜像,需要让 podman pull 走代理。务必改成用户级配置,不要写在 /etc/profile.d/ 里导出 HTTP_PROXY 环境变量——那会污染整个系统的环境变量,影响 Podman 之外的所有进程。
只需在用户主目录的 ~/.config/containers/ 下写一份 containers.conf,代理仅在容器Podman引擎层生效,全局用户环境不受影响:
mkdir -p ~/.config/containers/
cat << EOF >> ~/.config/containers/containers.conf
[engine]
env = [
"HTTP_PROXY=http://127.0.0.1:1080",
"HTTPS_PROXY=http://127.0.0.1:1080",
"NO_PROXY=localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
]
[containers]
http_proxy = false
EOF
说明:
- 内网段(10/8、172.16/12、192.168/16)和 localhost 走直连,避免近处流量也绕代理。
http_proxy = false阻止 Podman 自动把宿主机代理转发进容器,代理只用于引擎层拉镜像。
三、核心:用 Podman 部署 Gitea
最简单的单容器部署(SQLite 版,开箱即用):
podman run -d
--name git
-v gitea:/data
-p 3000:3000
--restart=always
gitea/gitea
参数说明:
-v gitea:/data:把数据挂到命名卷gitea,所有仓库、数据库、配置都在这,方便备份与迁移。-p 3000:3000:宿主机 3000 端口映射容器 3000,浏览器访问http://<服务器IP>:3000即进入 Gitea。--restart=always:容器异常退出自动重启。
四、关键:让 Gitea 能去拉公网仓库(离线镜像的关键前置)
Gitea 若要镜像 GitHub/Gitee 等外部仓库,需要让容器内也能走代理。用 podman update 为运行中的容器动态设置代理:
podman update --env "HTTPS_PROXY=http://192.168.100.100:1081" git
podman update --env "HTTP_PROXY=http://192.168.100.100:1081" git
podman update --env "NO_PROXY=localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" git
需要撤销时:
podman update --unsetenv HTTPS_PROXY git
podman update --unsetenv HTTP_PROXY git
查看当前代理环境变量:
podman inspect git --format {{.Config.Env}}
六、离线 Git 镜像:数据卷导出/导入,整体搬运仓库
这是”离线部署”的核心:内网(无外网)机器 A 上建好仓库存量后,通过数据卷一键打包成 tar,拷贝到离线机器 B 上导入,即可在新环境零配置还原完整仓库数据。
6.1 在源机器导出
# 查看某个容器的数据卷
podman inspect git --format {{.Mounts}}
# 把数据卷导出为 tar 包
podman volume export -o git.tar gitea
说明:
gitea是卷名(见部署时-v gitea:/data),导出的git.tar即整个/data的内容,包含所有 git 仓库、配置与数据库。
5.2 在目标离线机器导入
# 先建同名卷
podman volume create gitea
# 导入 tar 到该卷
podman volume import gitea git.tar
随后按”核心部署”命令重新 podman run 一个同名 git 容器挂载该卷即可,仓库数据完全还原——这就完成了离线环境间的 Git 镜像搬运。
七、开机自启:容器随宿主机启动
- 对普通用户(rootless),开启常驻让容器在用户未登录时也能跑:
loginctl enable-linger <用户名>
# 用户级自启
systemctl --user enable podman-restart
- 对全局/root 部署,直接用系统级服务:
sudo systemctl enable podman-restart
配合部署时的 --restart=always,即可实现容器崩溃自拉起、开机自启。
八、完整落地清单速览
| 环节 | 一句话要点 |
|---|---|
| 安装 Podman | RPM 系自带/仓库安装,命令兼容 Docker |
| 拉镜像 | 本地有镜像直接用;无则配代理 pull gitea/gitea |
| 起容器 | podman run -v gitea:/data -p 3000:3000 gitea/gitea |
| 自定义网络 | podman network create spring 隔离 + 跨容器互访 |
| 外部仓库镜像 | podman update --env "HTTP(S)_PROXY=..." git |
| 离线搬运 | podman volume export → 拷贝 → volume import |
| 自启动 | enable-linger + systemctl --user enable podman-restart |
收尾检查:
podman ps # 确认 git 容器 Running
podman inspect git --format {{.Mounts}} # 确认数据卷挂载正常
curl http://<服务器IP>:3000 # 访问 Gitea Web 界面
八、常见坑
- 端口被占用:改
-p左宿主机端口(如3001:3000)。 - 拉镜像慢/失败:先配好 6 去二里的代理,注意
NO_PROXY别漏内网段。 - 卷导入后数据不出现:确认卷名与部署时
-v指定的卷名一致(gitea)。 - 掉电后卷丢失:数据卷是持久化的,但建议定期
podman volume export备份到异机。 - 权限问题:rootless 确保持卷目录归属与运行时 UID 兼容。