如何通过Terraform部署phpMyAdmin容器_云原生基础设施即代码实践

2次阅读

phpmyadmin 容器在 terraform 中需用 docker_service(启用 Swarm)而非 docker_container,确保网络互通、PHPMYADMIN_ARBITRARY=1、SECRET_cookie_KEY 固定、健康检查与端口发布正确,并显式配置 Docker host 路径。

phpMyAdmin 容器在 Terraform 里不能直接用 docker_container 起就完事

因为 docker_container 资源不处理网络依赖、健康检查、配置挂载等实际运维细节,硬起容易连不上 mysql 或 502 报错。真正能跑通的关键是:mysql 实例必须先就绪、容器间网络互通、phpmyadmin_arbitrary 环境变量得设对,否则登录页加载一半就卡住。

  • MySQL 必须用 docker_containerdocker_service 显式声明,并加 depends_on(注意:Terraform 的 depends_on 只控创建顺序,不等容器 ready)
  • 两个容器必须在同一个自定义 Docker 网络里,用 docker_network 创建后显式 attach,别依赖默认 bridge
  • PHPMYADMIN_ARBITRARY=1 必须设,否则 phpMyAdmin 默认只认 localhost,连不了同网段的 MySQL 容器名
  • 把 MySQL root 密码通过 env 注入,别写死在 command 里——Terraform state 会明文存密码

用 docker_service 替代 docker_container 更稳当

docker_service 是 Docker Swarm 模式下的资源,自带滚动更新、健康检查和内置服务发现,比裸 docker_container 更适合生产级部署。但前提是你的 Docker daemon 开了 Swarm mode(docker swarm init),否则 apply 直接报错 Error response from daemon: this node is not a swarm manager

  • 启用 Swarm 后,docker_service 会自动处理容器重启、端口发布、DNS 解析(比如用 mysql 当 host 连接)
  • 健康检查要用 healthcheck 块配 curl -f http://localhost/,不然服务起来了但页面打不开,Terraform 还以为 OK
  • 镜像选 phpmyadmin/phpmyadmin:5,别用 latest——Terraform 每次 plan 都会误判变更,触发无谓重建
  • 暴露端口必须用 publish_mode = "ingress" + target_port = 80,否则宿主机 curl 通但浏览器打不开

本地测试时 docker_host 必须指向正确的 Docker socket

Terraform 默认连 unix:///var/run/docker.sock,Mac 上 Docker Desktop 改成了 unix:///Users/xxx/.docker/run/docker.sockwindows WSL2 下又可能是 tcp://localhost:2375。路径错一个字符,terraform apply 就报 Failed to connect to Docker daemon,而不是更具体的错误。

  • 先手动运行 docker ps 确认环境正常,再查 echo $DOCKER_HOSTdocker context show
  • 在 provider 块里显式写死 host = "unix:///var/run/docker.sock",别依赖环境变量——Terraform 不读 shell 的 $DOCKER_HOST
  • linux 下如果提示 permission denied,把当前用户加进 docker 组后要重新登录终端,否则 terraform init 仍失败

别漏掉 phpMyAdmin 的 SECRET_COOKIE_KEY 配置

没设 PHPMYADMIN_SECRET_COOKIE_KEY,每次容器重建都会生成新密钥,导致浏览器 session 失效、反复跳登录页,看着像“连上了又断”。这不是网络问题,是 phpMyAdmin 内部校验机制在作祟。

  • 值必须是 32 字符以上随机字符串,可用 openssl rand -base64 32 生成一次,硬编码进 Terraform 变量
  • 不能用 random_password 资源动态生成——它每次 plan 都变,Terraform 会认为必须重建容器
  • 这个 key 和 MySQL 密码一样,属于敏感配置,建议用 tfvars 文件隔离,别塞进 main.tf
  • 如果用 docker_service,key 要放在 env 列表里,不是 args;放错位置会导致容器启动失败但日志不报错

最麻烦的是:所有这些配置项之间有隐式依赖,比如网络没建好,SECRET_COOKIE_KEY 再对也白搭。调的时候得按“网络 → MySQL → phpMyAdmin”顺序验证,别一上来就改 cookie key。

立即学习PHP免费学习笔记(深入)”;

text=ZqhQzanResources