Docker环境下CodeIgniter 4连接MySQL失败排查求助
解决CodeIgniter 4在Docker中无法连接MySQL的问题
我帮你梳理下几个关键问题,修改后应该就能正常连接了:
1. Docker容器间的主机名配置错误
在Docker Compose的自定义网络里,容器之间是通过服务名称来通信的,你把CodeIgniter配置里的hostname设为localhost是错误的——localhost在CodeIgniter容器里指向它自己,而不是MySQL容器。你需要把hostname改成Docker Compose里MySQL服务的名称db。
2. 数据库用户权限问题
你在Docker Compose里创建了user1用户,但CodeIgniter配置里用的是root。MySQL 8.0默认root用户只允许从localhost(也就是MySQL容器内部)访问,CodeIgniter容器属于外部主机,所以root无法跨容器连接。应该改用你预先创建的user1用户,对应的密码是user1。
3. 控制器代码的语法错误
最后一行的print_r(row);里的row没有加$符号,这会触发PHP语法错误,虽然不是当前连接失败的原因,但修复后才能正常输出查询结果。
修正后的配置和代码
1. 修改CodeIgniter的数据库配置(App/Config/Database.php)
public $default = [ 'DSN' => '', 'hostname' => 'db', // 替换为Docker MySQL服务名 'username' => 'user1', // 改用创建的专用用户 'password' => 'user1', // 对应用户密码 'database' => 'dbase', 'DBDriver' => 'MySQLi', 'DBPrefix' => '', 'pConnect' => TRUE, 'DBDebug' => TRUE, 'cacheOn' => false, 'cacheDir' => '', 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, 'strictOn' => false, 'failover' => [], 'port' => 3306, ];
2. 修正控制器代码
$db = \Config\Database::connect(); // 可以用var_dump($db)查看连接状态,代替echo !$db $query = $db->query('SELECT * FROM wp_users'); $results = $query->getResult(); foreach ($results as $row) { print_r($row); // 加上$符号 }
额外优化:确保MySQL完全就绪后再启动CodeIgniter
Docker的depends_on只保证启动顺序,不保证MySQL服务完全就绪。如果还是偶尔连接失败,可以给MySQL服务添加健康检查,让CodeIgniter等MySQL就绪后再启动:
修改docker.yml里的db服务:
db: image: mysql/mysql-server:8.0 ports: - "42313:3306" volumes: - ./db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: 123 MYSQL_DATABASE: dbase MYSQL_USER: user1 MYSQL_PASSWORD: user1 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p123"] interval: 5s timeout: 5s retries: 5
内容的提问来源于stack exchange,提问作者dgggggggğ




