Как настроить подключение к базе на хосте из контейнера?

Настроен nginx и php через docker-compose.yml
Как сделать чтобы php мог подключиться к локальной БД?

version: '2'
services:
    web:
        build:
            context: ./
            dockerfile: web.docker
        volumes:
            - ./:/var/www
        ports:
            - "8080:80"
        links:
            - app
    app:
        build:
            context: ./
            dockerfile: app.docker
        volumes:
            - ./:/var/www
  • Вопрос задан
  • 9709 просмотров
Пригласить эксперта
Ответы на вопрос 2
Tyranron
@Tyranron
Пробросить контейнеру app через переменные окружения (environment variables) хост, логин и пароль для доступа к БД. В коде app взять параметры подключения к БД из проброшенных переменных окружения.
Либо, подмонтировать в volumes папку с unix-сокетом базы данных и в коде app подключится к этому сокету. Но это будет работать только тогда, когда БД и app строго на одной машине.
Ответ написан
@hacker2001
Самое простое решение - это `docker run --network host...` либо в `docker-compose.yml` добавить:

version: '3'

services:
  myservice:
    // ...
    network_mode: host


По целому ряду причин эти решения могут нам не подходить. Далее я опишу еще одно решение.

Итак, для начала нам нужно узнать свой локальный ip-адрес:

$ hostname -I | cut -d ' ' -f1
192.168.0.82


Далее нужно получить путь до config-файла:

$ psql
psql (10.5 (Ubuntu 10.5-0ubuntu0.18.04))
Type "help" for help.

sergey=# SHOW config_file;
               config_file               
-----------------------------------------
 /etc/postgresql/10/main/postgresql.conf
(1 row)

sergey=# \q


Потом добавить локальный айпи в список прослушиваемых адресов:

$ sudo nano /etc/postgresql/10/main/postgresql.conf


Должно получиться что-то типа этого:

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = 'localhost,192.168.0.82'  # можно просто звездочку (*) напечатать


В конец `/etc/postgresql/10/main/hba_conf.conf` нужно добавить строку:

host all all 172.17.0.0/8 md5

Это позволит избежать ошибок вида:

asyncpg.exceptions.InvalidAuthorizationSpecificationError: no pg_hba.conf entry for host "172.17.0.x"


Перезапускаем Postgres:

$ sudo sytemctl restart postgresql

Ну и далее в скриптах вместо localhost указываем локальный айпишник.

Инструкция здесь

Описанный способ подходит и для mysql: нужно чтобы mysql-сервер слушал хост 0.0.0.0
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы