使用自定义端口连接数据库 Codeigniter 4

Connecting Database Codeigniter 4 With Custom Ports

所以,我正在尝试从我的网络服务器容器连接到我的数据库容器。我目前将 Codeignter 4 用于我的 PHP 框架。就不同容器之间的通信而言,一切进展顺利,因为该容器位于同一网络内。在网络服务器容器内,我尝试在数据库容器之间 ping 没有问题,所有端口都可以访问,因为我可以连接 PHPMyAdmin,它在他们自己的小容器中并毫无问题地连接到我的数据库容器.

这是回溯

SYSTEMPATH/Database/BaseConnection.php : 618   —  CodeIgniter\Database\BaseConnection->initialize ()

我尝试从我的控制器进行 DD,希望覆盖任何 return 视图

$db = \Config\Database::connect();
$apakek = $db->query("SELECT * FROM student_details_dummy");
dd($apakek);

这是我在 App\Database 中的数据库数组。php

public $default = [
    'DSN'      => '',
    'hostname' => '172.21.0.4',
    'username' => 'kr_rw',
    'password' => 'MrSLwwZvwC1KCRm6',
    'database' => 'kr_main',
    'DBDriver' => 'MySQLi',
    'DBPrefix' => '',
    'pConnect' => false,
    'DBDebug'  => (ENVIRONMENT !== 'development'),
    'cacheOn'  => false,
    'cacheDir' => '',
    'charset'  => 'utf8',
    'DBCollat' => 'utf8_general_ci',
    'swapPre'  => '',
    'encrypt'  => false,
    'compress' => false,
    'strictOn' => false,
    'failover' => [],
    'port'     => 21236,
];

我试过使用主机名 db_mysql,它可以与相应的端口 ping 通,甚至可以检查 canyouseeme.org return 上的开放端口。

我该如何解决?

PS:所有必要的扩展都已安装并启用,包括php_mysqli php_mbstring php_pdo 如有遗漏请指出。

如果在docker你必须在外面打开端口并且主机应该是你的容器名称

ports:
  - "33088:3306"

'hostname' => 'container_name',

If you're not using .env to pass config params to docker, then specify it on container level. (example below)

environment:
  DB_DATABASE: db_mysql
  DB_USERNAME: .........

我的项目示例代码

在docker-compose.yml

services:
  ## -----------------------------------------------
  ##           MySql database
  ## -----------------------------------------------
  db_mysql:
    image: mysql:5.7
    restart: always
    volumes:
      - db_mysql:/var/lib/mysql
      - ./mysql:/docker-entrypoint-initdb.d
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: root
    deploy:
      mode: global
    ports:
      - "33088:3306"

在数据库文件中(我用的是Laravel。但是在Codeigniter中,是一样的)

public $default = [
    'DSN'      => '',
    'hostname' => 'db_mysql',
    'username' => 'root',
    'password' => '',
    'database' => 'kr_main',
    'port'     => 33088,
];

所以,我自己也不确定为什么会这样。我为这 3 个容器创建的网络就像是一组计算机的本地网络。所以它基本上归结为:

  1. 在 Docker 网络之外:使用端口转发。
  2. 在Docker网络内部:使用容器的默认端口。

所以最后我直接用3306或者默认端口访问mysql.