Подключение с хоста в Docker
Подключение с хоста идёт на опубликованный порт компьютера, а не внутрь сети контейнера. Клиент снаружи не знает внутренний адрес сервиса и стучится туда, куда проброшен номер порта.
Сервис db на mysql:9.7
получает пароль demo
и пару портов 3306:
services:
db:
image: mysql:9.7
environment:
MYSQL_ROOT_PASSWORD: demo
ports:
- "3306:3306"
После фонового подъёма проекта отдельная короткая копия клиента достаёт опубликованный порт через адрес компьютера:
docker compose up -d
Запрос с той же учебной
парой логина идёт
на имя host.docker.internal:
docker run --rm --add-host=host.docker.internal:host-gateway mysql:9.7 mysql -h host.docker.internal -P 3306 -uroot -pdemo -e "SELECT 1"
Имя host.docker.internal
с записью --add-host
и host-gateway указывает
на компьютер, где открыт порт.
Запрос проходит, когда сервер
уже слушает снаружи.
Поднимите сервис db с портом 3308 наружу и проверьте короткий запрос с отдельной копии mysql:9.7 через адрес хоста.
Отметьте, что соединение идёт на опубликованный номер, а не на имя сервиса внутри проекта.