docker默认bridge网络不支持容器名解析,仅自定义bridge网络(如mynet)中容器才能通过名称(如mysql-db)互相访问;ci4应用若不在该网络内或未正确配置dbdriver及dsn,则无法解析容器名。

因为容器名只是 Docker 内部 DNS 的别名,只在同一个自定义网络(custom bridge network)中生效,而 CodeIgniter 4 应用若不在该网络内,就解析不了这个名称。
容器名只能被同网络的其他容器识别
Docker 默认的 bridge 网络不支持容器名自动解析;只有你显式创建了自定义网络(如 docker network create mynet),再把 MySQL 容器和 CI4 应用容器都连到 mynet 上,容器名(比如 mysql-db)才能被互相访问。
- 直接用
docker run启动的容器默认在bridge网络,彼此无法通过名字通信 -
localhost在 CI4 容器里指向容器自身,不是宿主机,更不是另一个容器 - 若 CI4 运行在宿主机(非容器),那容器名对它完全不可见——没有 Docker DNS 解析环境
CI4 配置里写容器名,但没配对网络或驱动
即使网络正确,CI4 的数据库驱动也得支持域名解析。MySQLi 和 PDO 都可以,但必须确保:
-
DBDriver设为MySQLi或PDO(大小写敏感) - 若用
PDO,DSN必须完整,例如:mysql:host=mysql-db;dbname=ci4db;charset=utf8mb4 -
hostname字段填的是容器名(如mysql-db),不能带端口(端口由 DSN 或默认 3306 决定)
常见误操作:本地开发 vs 生产部署混用
很多人在 .env 里写 database.default.hostname = "mysql-db",却忘了:
- 本地用 Docker Compose 启动时,服务名是否真叫
mysql-db(看docker-compose.yml中的services:下一级名称) - 生产环境(如 cPanel、共享主机)根本没有 Docker,写容器名必然失败,必须切回
localhost或真实 IP - 没清缓存:改完
.env后要运行php spark cache:clear,否则旧配置还在生效
快速验证方法
进 CI4 容器内部执行测试命令,绕过框架直连:
docker exec -it your-ci4-container bash-
apt-get update && apt-get install -y mysql-client(如无客户端) mysql -h mysql-db -u root -p'yourpass' -e "SELECT 1"
如果这步失败,说明网络或容器名本身就有问题;如果成功,再回头查 CI4 的 Database.php 或 .env 配置细节。











