Это была очень глупая и очень неприятная проблема, поэтому я обязана это записать, чтобы не повторять ошибку!
Задача: иметь доступ к контейнеру с базой из контейнера с php-приложением.
Допустим, у нас есть файл docker-compose.yml (пример сгенерировала в phpdocker.io):
1 | version: "3.1" |
Мы добросовестно запускаем
1 | $ docker-compose up |
и хотим получить для своего приложения доступ к базе MySQL, запущенной в этом контейнере.
Для того, чтобы подключиться к базе вне контейнера, можно использовать хост:порт 127.0.0.1:8082.
И вот тут я запуталась и посчитала, что и из контейнера php-fpm мы доступ к базе получим через тот же адрес. Неверно!
Docker-compose при запуске создаёт внутреннюю сеть, в которой сервисы обращаются друг к другу по именам. По именам сервисов, не контейнеров. В нашем случае, адрес базы данных просто “mysql” со стандартным портом.
Так что подключать базу нужно как-то так:
1 | $mysqli = new mysqli("mysql", "my-user", "my-password", "my-database"); |
Или, в моём случае, прописывать в файле .env для Symfony 4:
1 | DATABASE_URL=mysql://my-user:my-password@mysql:3306/my-database |