You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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ğ

火山引擎 最新活动