Доступ к базе данных в docker-compose

Это была очень глупая и очень неприятная проблема, поэтому я обязана это записать, чтобы не повторять ошибку!
Задача: иметь доступ к контейнеру с базой из контейнера с php-приложением.

Допустим, у нас есть файл docker-compose.yml (пример сгенерировала в phpdocker.io):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3.1"
services:

mysql:
image: mysql:5.7
container_name: my-project-mysql
working_dir: /application
volumes:
- .:/application
environment:
- MYSQL_ROOT_PASSWORD=root-password
- MYSQL_DATABASE=my-database
- MYSQL_USER=my-user
- MYSQL_PASSWORD=my-password
ports:
- "8082:3306"

webserver:
<...>

php-fpm:
<...>

Мы добросовестно запускаем

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