你现在这个情况,其实是 两个问题叠在一起了,但本质很清晰:网络 + MySQL host权限

我帮你拆开讲清楚,你就不会再踩坑。


✅ 一、先解决你当前核心架构

你现在是:

  • Typecho:跑在 宿主机 PHP
  • MariaDB:跑在 Docker 容器
  • 所以连接路径是:
    👉 宿主机 → Docker bridge 网络 → MariaDB

❗ 二、你刚才失败的原因

❌ 1. 用 mariadb118(容器名)

报错:

getaddrinfo for mariadb118 failed

原因:

👉 宿主机 DNS 解析不了 Docker 容器名

✔ 结论:

宿主机 PHP ❌不能直接用容器名访问数据库

❌ 2. user host 不匹配

你最初是:

'typecho_user'@'127.0.0.1'

但实际连接是:

172.19.0.1

所以被拒绝。


✅ 三、正确做法(推荐标准方案)

✔ 方案:允许 Docker 网段(最佳)

执行:

CREATE USER 'typecho_user'@'172.19.%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON typecho_db.* TO 'typecho_user'@'172.19.%';
FLUSH PRIVILEGES;

👉 或更简单(开发/个人服务器推荐):

CREATE USER 'typecho_user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON typecho_db.* TO 'typecho_user'@'%';
FLUSH PRIVILEGES;

✅ 四、Typecho 安装页面怎么填(关键)

因为你是 宿主机 PHP + Docker MariaDB

所以 DB_HOST 要填:


✔ 正确填写方式(3选1)

⭐ 推荐(最稳)

127.0.0.1

前提:你 MariaDB 已映射端口,比如:

-p 3306:3306

⭐ 或(如果宿主机有 docker bridge IP)

172.19.0.2

(MariaDB 容器 IP,不推荐,容易变)


❌ 不要用:

mariadb118 ❌(宿主机解析不到)

✅ 五、你现在最推荐架构(强烈建议)

如果你 MariaDB 是 Docker:

✔ 建议改成“宿主机访问 Docker”

1️⃣ docker run / compose 必须映射端口

确认:

ss -tlnp | grep 3306

应该看到:

0.0.0.0:3306

2️⃣ Typecho 安装填写:

项目
数据库地址127.0.0.1
数据库名typecho_db
用户typecho_user
密码KYOlkUCjI18kU3
前缀默认

🚀 六、一句话总结

你现在必须记住这个核心原则:

❗ 宿主机 PHP = 不能用 Docker 容器名
❗ Docker MySQL = 必须用 IP 或端口映射访问
❗ MySQL 用户 = 必须匹配来源 IP(172.19.% 或 %)

如果你想进一步优化(推荐)

我可以帮你把这套结构升级成:

🔥 标准生产架构

  • Typecho(PHP-FPM + Nginx)
  • MariaDB(Docker)
  • Redis(缓存)
  • 统一 1Panel / Caddy 反代
  • 自动备份脚本

会比你现在稳定一档。

只要你说一声 👍