Docker-Compose Использование PHP (MySQLi) для подключения к базе данных MySQL

0

Итак, вот сделка: я использую Docker-Compose для создания 3-х сервисов: один для платформы, один для db (mysql) и третий для PHPMyAdmin

Я пытаюсь использовать mysqli для подключения к базе данных на порту 5001.

Интересно, что я могу подключиться к базе данных с помощью SQL Workbench и PHPMyAdmin с теми же параметрами, но я получаю сообщение об ошибке (см. Ниже) при подключении с помощью PHP MySQLi

Платформа:

  $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);

Хост - 127.0.0.1, DB_USER - это root с соответствующим паролем, я предоставил имя_базы, а порт - 5001.

Мой Docker-Compose.yml выглядит следующим образом:

version: '3.3'

services:
  platform:
    build: .
    ports:
      - "5000:80"
    links:
      - db:mysql

  db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     ports:
       #- "5001:80"
       - "5001:3306"
     environment:
       MYSQL_ROOT_PASSWORD: some_great_password_here
       MYSQL_DATABASE: DB_NAME_HERE
       MYSQL_USER: USERNAME
       MYSQL_PASSWORD: PASSWORD

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db:mysql
    ports:
      - 8181:80
    environment:
      MYSQL_USERNAME: USERNAME
      MYSQL_ROOT_PASSWORD: PASSWORD

volumes:
    db_data:

По какой-то причине я продолжаю получать ошибку:

mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on '127.0.0.1' (111) in ...

Любые советы или решения будут высоко оценены!

Теги:
docker
mysqli
docker-compose

2 ответа

0

Я нашел решение своей проблемы после взлома документации и других сообщений Stackoverflow.

При попытке подключиться к базе данных изнутри контейнера нам нужно использовать имя контейнера/службы в отличие от "localhost" или 127.0.0.1. Это происходит потому, что когда мы вызываем "localhost", он ищет локальный хост внутри каждого контейнера. Нам нужно подключиться к базе данных MySQL внутри другого контейнера через сетевой мост.

Способ, которым мы это делаем, - просто псевдоним имени контейнера как хоста, так что:

$db = new mysqli("db", DB_USER, DB_PASS, DB_NAME, DB_PORT);

Обратите внимание, что имя хоста - это имя контейнера "db", как определено в файле docker-compose.yml. Это работает благодаря сетевому мосту докеров, который создается между контейнерами. Порт - это порт MySQL по умолчанию, равный 3306.

Однако важно отметить, что если мы хотим использовать "внешнее" приложение типа Sequel Pro или Workbench для подключения к базе данных, мы можем использовать localhost или 127.0.0.1 для подключения к базе данных, поскольку мы не имеем дело непосредственно с контейнерами. Однако следует отметить, что порт по умолчанию 3306 не будет работать в этой ситуации. Нам нужно сопоставить внешний порт с 3306. В моем случае это будет 5001, как показано в моем файле docker-compose.yml.

0

Вы сопоставили порт mysql до 3306 в соответствии с

- "5001:3306"

Вы должны попытаться подключиться к порту 3306 вместо 5001. Убедитесь, что ваши контейнеры используют Bridge Networking, чтобы они могли общаться друг с другом.

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);
  • 0
    Я пытался подключиться к 3306 напрямую, но безрезультатно. Как мне убедиться, что мостовая сеть включена? Я думал, что это по умолчанию. Что странно, если я могу подключиться к базе данных, используя SQL Workbench на порт 5001
  • 0
    Можете ли вы попробовать один раз подключиться, используя имя хоста в качестве localhost хоста вместо 127.0.0.1 .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню