Итак, вот сделка: я использую 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 ...
Любые советы или решения будут высоко оценены!
Я нашел решение своей проблемы после взлома документации и других сообщений 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.
Вы сопоставили порт mysql до 3306 в соответствии с
- "5001:3306"
Вы должны попытаться подключиться к порту 3306 вместо 5001. Убедитесь, что ваши контейнеры используют Bridge Networking, чтобы они могли общаться друг с другом.
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306);
localhost
хоста вместо127.0.0.1
.