Docker部署Halo还有哪些坑?

13 人参与

说起用 Docker 把 Halo 搞起来,我这几天真是跌跌撞撞。最开始,我还满怀期待地把官方的 docker-compose.yaml 复制粘贴到 NAS 的 /volume1/docker/halo 目录,心里想着「这下省事儿」,结果第一天就被一行红字吓哭了:permission denied while trying to connect to the socket

卷的权限——别忘了先给目录加上 777

我把 halo2db 两个挂载目录直接建在根目录,默认是 admin 用户,容器里跑的是 root。于是容器尝试写入 /root/.halo2 时被拒绝。解决办法很直接:chmod -R 777 halo2 db,或者在 docker-compose 里加上 user: "0:0"。这一步踩过去,后面的日志才会真正出现。

环境变量不统一——密码是关键

Halo 的数据库密码必须在 POSTGRES_PASSWORDspring.r2dbc.password 以及 halo.external-url 里保持一致。我第一次把密码写成 openpostgresql,结果在容器日志里看到 authentication failed for user "halo",于是只好把所有地方的密码统一改成 MySecret123,记得写在 .env 文件里,免得手动改来改去。

健康检查卡死——别让它无限重启

官方的 healthcheckcurl -f http://localhost:8090/actuator/health/readiness,但我的容器一启动就一直显示 unhealthy,原因是 external-url 里写成了 localhost,容器内部根本访问不到外网。把它改成 http://host.docker.internal:8090(或者直接删掉让 Halo 使用默认)后,健康检查顺利通过,容器也不再疯狂重启。

内存与 JVM 参数——别让 OOM 把容器砍掉

Halo 默认 -Xmx256m,在我这台只有 2GB 内存的 NAS 上运行,刚好够用。但一旦打开了图片上传功能,内存瞬间飙到 800MB,容器直接 OOM 退出。把 JVM_OPTS 改成 -Xmx1g -Xms512m 并在 docker-compose 里加上 mem_limit: 1g,系统稳住了。其实只要根据自己的硬件适配一下,别把默认值当成金科玉律就行。

网络冲突——端口被占用的尴尬

我曾经把 Halo 的 8090 端口映射到宿主机的同一个端口,却忘了已经有一个旧的 Nextcloud 容器占用了。启动时 Docker 报错 port is already allocated,我只好改成 8091:8090,顺手把反向代理的配置也改了一遍。以后检查 docker ps,确认端口空闲再动手,省得手忙脚乱。

  • 先检查挂载目录权限,必要时给 777 或指定容器用户。
  • 密码统一管理,建议放进 .env,避免手动笔误。
  • 健康检查的 URL 要指向容器内部可达的地址。
  • 根据硬件调节 JVM 内存,防止 OOM。
  • 启动前用 docker ps 确认端口不冲突。

总的来说,Docker 把 Halo 装进容器里其实并不难,真正卡住的往往是这些细节。把它们一一击破,后面就能安安静静地写博客、发图文了。好啦,祝你玩得开心~

参与讨论

13 条评论
  • AndromedaFury

    数据库密码要统一这个太关键了,我上次就是漏了一个地方。

  • 棉花糖软软

    健康检查卡住那会儿,我还以为是网络问题,原来是URL写错了。

  • 天启坦克

    2G内存的NAS跑Halo确实有点吃力,调了JVM参数才好点。

  • 琴师曹

    权限问题真的坑,之前我也折腾了好久才搞定。

  • 烟罗轻纱

    端口占用这个太真实了,经常启动失败才发现是被别的服务占了。

  • 深蓝幻想

    想问下,如果用host模式跑,健康检查的地址该怎么写?

  • 旧磁带

    感觉楼主总结的这几个点都挺到位的,帮大忙了。🤔

  • 时光漫客

    我之前在树莓派上部署也遇到过OOM,加了swap才解决。

  • 夜读诗书

    反向代理这块能再细说一下吗?Nginx配置有什么要注意的?

  • 流云的遐想

    这些坑踩一遍,下次部署就顺手多了。

  • 蒲公英糖果

    直接给777权限会不会有安全风险啊?

  • 灵晔

    总算看到有人把这些问题说清楚了,点赞。

  • 梦畔孤舟

    看来部署前真得好好检查一遍配置,不能直接复制粘贴。