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_container或docker_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.sock,windows WSL2 下又可能是 tcp://localhost:2375。路径错一个字符,terraform apply 就报 Failed to connect to Docker daemon,而不是更具体的错误。
- 先手动运行
docker ps确认环境正常,再查echo $DOCKER_HOST或docker 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免费学习笔记(深入)”;