使用自定义端口连接数据库 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 个容器创建的网络就像是一组计算机的本地网络。所以它基本上归结为:
- 在 Docker 网络之外:使用端口转发。
- 在Docker网络内部:使用容器的默认端口。
所以最后我直接用3306或者默认端口访问mysql.
所以,我正在尝试从我的网络服务器容器连接到我的数据库容器。我目前将 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 个容器创建的网络就像是一组计算机的本地网络。所以它基本上归结为:
- 在 Docker 网络之外:使用端口转发。
- 在Docker网络内部:使用容器的默认端口。
所以最后我直接用3306或者默认端口访问mysql.