Используя Docker-compose, как получить доступ к базе данных контейнера через один и тот же порт в контейнере и в хосте - PullRequest
0 голосов
/ 09 января 2019

Я использую контейнер docker-compose для postgresql. База данных postgresql в контейнере работает на стандартном порту 5432, и я публикую этот порт на порт 5444 на хосте (поскольку порт хоста по умолчанию используется postgresql).

Я использую одну и ту же конфигурацию на хосте и в контейнере (файл .env, который предоставляет настройки конфигурации для команд cli и приложения в целом). К сожалению, какой бы порт я ни выбрал, одна система потеряет доступ. Например, я не могу запустить:

[k@host]$ pgsql -p 5444 # Connects

в хосте и все еще есть работа внутри контейнера:

[k@db-container]$ pgsql -p 5444 # Errors in container

Сервер postgresql контейнера работает на 5432:

[k@db-container]$ pgsql -p 5432 # Connects successfully in container

и порты публикуются через docker-compose.yml через: - порты: - "5444: 5432"

Так что в настоящее время я не знаю, как настроить один и тот же порт везде просто через docker-compose.yml! Команда expose выставляет порт, но не позволяет переназначить, ports пересылает контейнер host <->, но не переназначает внутренний порт. Я думал о переназначении порта по умолчанию для postgresql в конфигурации контейнера postgresql, но полная перенастройка postgresql кажется нетривиальной задачей при помощи docker-compose для каждого docker-compose up.

Как я могу переназначить порты внутри контейнера, чтобы я мог использовать порт 5444 везде, в хосте и контейнере?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Стандартная клиентская библиотека PostgreSQL поддерживает несколько переменных среды , которые сообщают ему, где находится сервер. Таким же образом, как вы можете настроить хост, используя $PGHOST, вы можете настроить порт, используя $PGPORT.

В контексте Docker Compose должно быть просто установить эти значения:

version: '3'
services:
  postgres:
    image: postgres:11
    ports: ['5444:5432']
    volumes: ['./postgres:/var/lib/postgresql/data']
  myapp:
    build: .
    ports: ['8888:8888']
    env:
      PGHOST: postgres
      # default PGPORT=5432 will work fine

Аналогично, если вы запускаете приложение в среде разработки на хосте, вы можете установить

PGHOST=localhost PGPORT=5444 ./myapp
0 голосов
/ 09 января 2019

Нельзя использовать один и тот же порт на хосте .

Ничто не мешает запускать несколько экземпляров, если они имеют разных IP-адресов.

psql -p 5444

По умолчанию psql --host=127.0.0.1 -p 5444. Если вам нужно несколько экземпляров - очевидно, вы должны каким-то образом их отличать.

...