Итак, я пытаюсь подключиться к контейнеру базы данных из контейнера веб-сервера. В настоящее время я использую Codeignter 4 для своей PHP-платформы. Все идет хорошо с точки зрения взаимодействия между разными контейнерами, потому что этот контейнер находится внутри одной и той же сети. Внутри контейнера веб-сервера я попытался без проблем выполнить ping из контейнера базы данных и в него. Весь порт доступен, потому что я могу подключить PHPMyAdmin, который в своем собственном маленьком контейнере, и без проблем подключиться к моему контейнеру БД.

Это след

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

Я попытался выполнить DD со своего контроллера, надеясь отменить любое возвращаемое представление

$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, который можно проверить с помощью соответствующего порта, чтобы даже проверить открытый порт на canyouseeme.org, возвращающий штраф.

Как мне решить эту проблему?

PS: все необходимые расширения установлены и включены, включая php_mysqli php_mbstring php_pdo, если что-то пропало, пожалуйста, укажите.

0
KotjengOren 23 Фев 2021 в 06:13

2 ответа

Лучший ответ

Итак, я сам не уверен, почему это так. Сеть, которую я создал для этих трех контейнеров, действовала как локальная сеть для группы компьютеров. Так что это в основном сводится к следующему:

  1. Вне сети Docker: используйте перенаправление портов.
  2. Внутри сети Docker: используйте порт контейнера по умолчанию.

В итоге я просто использую 3306 или порт по умолчанию для доступа к mysql.

0
KotjengOren 25 Фев 2021 в 01:51

Если он находится в докере, вам нужно открыть порт снаружи, и хост должен быть вашим именем контейнера.

ports:
  - "33088:3306"

А также

'hostname' => 'container_name',

Если вы не используете .env для передачи параметров конфигурации докеру, укажите это на уровне контейнера. (пример ниже)

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,
];
1
Abdulla Nilam 25 Фев 2021 в 07:21