Chupurnov Valeriy
Chupurnov Valeriy
Front End Engineer

Как в docker-compose использовать localhost

Предположим, в docker-compose.yml у вас лежит вот такая штука:

version: '3.7'
services:
    mysql:
        image: mysql
        container_name: mysql-blog
        ports:
            - '1095:3306'

        expose:
            - 1095

        command: --character-set-server=utf8
            --collation-server=utf8_general_ci
            --default-authentication-plugin=mysql_native_password
            --sql-mode=NO_AUTO_VALUE_ON_ZERO

        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 'passsword'
            MYSQL_DATABASE: dbname

    some-node-app:
        image: chupurnov/some-node-app
        ports:
            - '8012:8012'

Два контейнера, один для базы данных, второй на ноде. Из ноды нужно обращаться в эту базу. Но какой у нее хост?

Кажется очевидным localhost. Но это не так. В интернете пишут про такое решение: запускаем композ, а затем в командной строке выполняем

docker inspect mysql-blog | grep Gateway

По идее, оно покажет ip, по которому можно обращаться к мускулу. Но вот досада, этот ip может измениться.

Как быть?

В интернете вы найдете упоминание host.docker.internal, но такой хост докер не видит. Оказывается в новой версии docker-compose@3.7 появилась такая штука:

some-node-app:
        image: chupurnov/some-node-app
        ports:
        - '8012:8012'
        extra_hosts:
          - 'host.docker.internal:host-gateway'

И теперь к внутреннему локалхосту можно обращаться как к host.docker.internal.