数据库配置关键在于分离服务并确保容器网络互通:mysql 独立运行于名为 db 的容器,ci 通过 'hostname' => 'db' 连接;需挂载数据卷、处理 mysql 8.0+ 认证插件兼容性,并启用 php 数据库扩展。

在 Docker 容器中运行 CodeIgniter 时,数据库配置的关键在于分离应用与数据库服务,并确保两者能通过容器网络互通。不推荐把 MySQL 和 CodeIgniter 打包进同一个镜像,而应使用 docker-compose 管理多容器协作。
数据库服务需独立运行
用 docker-compose.yml 定义 MySQL 容器,并暴露端口、设置 root 密码、挂载数据卷:
- MySQL 容器名设为
db,这样 CodeIgniter 可通过服务名db访问(Docker 内置 DNS) - 避免映射到宿主机 3306(如用
3307:3306),防止本地 MySQL 冲突 - 务必挂载
/var/lib/mysql到宿主机目录,否则容器重启后数据丢失 - MySQL 8.0+ 默认使用
caching_sha2_password插件,CI3 若连接失败,需在初始化 SQL 中执行:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
CodeIgniter 的 database.php 配置要点
修改 application/config/database.php,让 CI 连接容器内网地址而非 localhost:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
-
'hostname' => 'db'—— 不是localhost或127.0.0.1,这是 Docker Compose 自动解析的服务名 -
'port' => '3306'—— 容器内部端口,不是宿主机映射端口 -
'username' => 'root'、'password' => '123456'要与docker-compose.yml中MYSQL_ROOT_PASSWORD一致 -
'database' => 'ci_app'应提前在 MySQL 初始化脚本中创建,或首次访问时手动建库
启动前确保网络与权限就绪
CI 容器必须和 DB 容器在同一自定义网络(Docker Compose 默认创建),且 PHP 需启用 mysqli 或 pdo_mysql 扩展:
- 检查 CI 镜像的
Dockerfile是否包含:
RUN docker-php-ext-install mysqli pdo pdo_mysql - 若用 Alpine 镜像,还需安装
mysql-client用于调试连接 - 启动后进入 CI 容器执行:
ping -c 3 db 和
nc -zv db 3306,确认网络连通性 - 数据库连接失败时,优先查
$this->db->conn_id是否为 resource,再看 CI 日志或 MySQL 容器日志(docker logs myapp_db)
动态连接可选:运行时切换库
如果项目需按请求连接不同数据库(如租户隔离),不要改 database.php,而是用 CodeIgniter 的动态加载机制:
- 在控制器中构造配置数组,
hostname仍填db,只变database、username等字段 - 调用
$db = $this->load->database($config, TRUE),返回 DB 实例,再用$db->query()操作 - 注意:动态连接不走自动加载,需手动传参;失败时该调用返回
FALSE,可据此做降级处理










