
大家好!相信很多像我一样喜欢在 NAS 上折腾 Docker 的朋友,可能都遇到过安装的服务突然“罢工”的情形。作为一个“技术小白”,面对一堆看不懂的日志和红色的错误提示,会懵圈无助。今天我想和大家分享一次,我在 AI 一步步指导下,如何解决 WordPress Docker 容器”Unhealthy” 状态的完整过程。希望我的这次经历能给遇到类似问题的朋友们提供一些参考和信心。
一、问题的突现:好好的博客怎么就“挂”了
我的 WordPress 博客一直通过 Docker Compose 部署在 NAS 上,包含 WordPress、MariaDB、phpMyAdmin 和 Redis 这些服务。之前一直稳定运行,直到前几天,我发现 WordPress 容器的状态在 Portainer 里变成了红色的 “Unhealthy”,博客网页无法访问,管理员后台也登录异常。
# docker-compose.yml 中的部分配置
services:
wordpress:
# ... 其他配置 ...
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 5
depends_on:
db:
condition: service_started
redis:
condition: service_healthy
phpmyadmin:
condition: service_healthy
健康检查命令 curl -f http://localhost:80/ 失败,意味着在容器内部访问 WordPress 自身的 Web 服务时返回了错误。
二、初步排查:我复制黏贴 AI 排查原因
我唯一熟悉的命令行操作,就是通过 SSH 登录我的 NAS。用命令行和 docker 容器交互得到的反馈,能够让 AI 精准定位问题的根源。
AI 就像一位经验丰富的医生,分析症状并开出“检查单”,我则负责去“化验科”(我的 SSH 终端)执行这些检查并将“化验报告”(命令输出)拿给 AI“医生”解读。
docker ps -a # 确认容器状态 docker logs WordPress # 查看 WordPress 容器日志输出 docker logs WordPress-DB # 查看 MariaDB 容器日志输出 docker logs WordPress-REDIS # 查看 Redis 容器日志输出 docker logs WordPress-phpMyAdmin # 查看 phpMyAdmin 容器日志输出
一个早期的小插曲是,当我尝试执行 AI 建议的、直接查看容器内 Apache 错误日志的命令(docker exec WordPress tail /var/log/apache2/error.log)时,命令会卡住。我把这个现象反馈给 AI,AI 推断可能是日志配置问题,并建议我执行:
docker exec WordPress ls -lh /var/log/apache2/
结果发现,error.log 和 access.log 都被符号链接到了 /dev/stderr 和 /dev/stdout。这意味着所有日志理论上都应该通过 docker logs WordPress 输出。这个发现帮助我们排除了一个错误的排查方向。然而,尽管日志配置看起来能将所有信息输出,关键的 PHP 致命错误信息却如同石沉大海般,迟迟没有出现。
三、深入调试:与 AI 携手“魔改” wp-config.php
既然标准日志没有足够信息,AI 建议我在 wp-config.php 中增强调试能力。具体操作如下:
// 1. 在文件顶部添加,开启 PHP 错误记录,并记录加载测试
@ini_set('display_errors', 1);
@ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@ini_set('log_errors', 1);
@ini_set('error_log', '/var/www/html/wp-content/explicit_error_test.log');
file_put_contents(
'/var/www/html/wp-content/wp_config_loaded_test.txt',
'wp-config.php loaded at ' . date('Y-m-d H:i:s')
);
// 原始配置继续…
// 2. 在文件末尾加载测试前添加,确认执行到最后
file_put_contents(
'/var/www/html/wp-content/wp_config_ending_test.txt',
'Reached end at ' . date('Y-m-d H:i:s')
);
require_once ABSPATH . 'wp-settings.php';
# 3. 重启容器并验证测试文件生成 docker restart WordPress ls /volume1/docker/wordpress/wp-content/ # 应能看到: # wp_config_loaded_test.txt # wp_config_ending_test.txt
结果证明 wp-config.php 成功加载且可写。
# 4. 检查错误日志 cat /volume1/docker/wordpress/wp-content/explicit_error_test.log # 日志仅显示警告:PHP Warning: Constant WP_DEBUG already defined...
AI 进一步引导我审查完整文件,发现末尾多余 } 及重复 require_once wp-settings.php;,导致 Parse Error 直接中断脚本。修复该语法错误后,病因却依然不明朗。
四、柳暗花明:我的一次建议,让 AI 找到病根
经过了长时间的尝试,各种日志分析似乎都未能直指病因,我建议 AI 尝试禁用所有插件。结果之后的 curl 命令返回 HTTP 500 错误头!这让 AI 判断响应体里可能隐藏着关键线索。于是,AI 调整 curl 命令
docker exec -it WordPress curl -vk http://localhost:80/
终于!在返回的 HTML 内容中,发现了问题所在:
<body id="error-page">
<div class="wp-die-message">
<h1>Error establishing a Redis connection</h1>
<p>To disable Redis, delete the <code>object-cache.php</code> file in the <code>/wp-content/</code> directory.</p>
</div>
</body>
</html>
同时,/wp-content/explicit_error_test.log 文件也终于记录到了更具体的异常信息:
Exception: Predis library not found. Re-install Redis Cache plugin or delete the object-cache.php. in /var/www/html/wp-content/object-cache.php:868

真相大白!问题出在 WordPress 尝试连接 Redis 时出错,具体原因是其依赖的 Predis PHP 库没有找到。这通常是由于 wp-content/object-cache.php 文件(由 Redis 相关的缓存插件提供)导致的。
五、拨乱反正:移除 Redis 依赖,博客重获新生
临时禁用 Redis 对象缓存并重启容器
docker exec -it WordPress mv /var/www/html/wp-content/object-cache.php /var/www/html/wp-content/object-cache.php.disabled docker restart WordPress
确认容器恢复健康
docker ps -a # WordPress 容器状态变为 (healthy)
修改 docker-compose.yml:删除 redis 服务及相关 depends_on 条目
恢复其他插件并测试,确认站点在无 Redis 环境下正常运行。
六、经验总结与反思
- 日志是金矿:需通过调试手段挖掘隐藏信息。
- AI 也需要人给出指导:AI 可提供排查思路和方向,但需要用户根据现场反馈验证、调整,才能形成真正有效的诊断策略。
- 人机协作:AI + SSH 操作,提高效率。
- 拥抱命令行:底层控制更可靠。
- 成就感满满:排错过程中收获经验与信心。
七、结语
希望我的经历能给同样使用 Docker 部署 WordPress 或者其它容器的小伙伴一些启发。即使自认“技术小白”,只要有耐心、善用工具与方法,也能逐步解决问题。欢迎在评论区分享您的排查经验与心得!