Как подключиться к сервису Postgresql внутри Docker Swarm?

У меня есть кластер Docker Swarm с 3 серверами (1 менеджер и 2 рабочих).

Я запустил службу Postgresql, используя следующую команду:

docker service create --name postgresql \
  --mount src=pg_data,dst=/var/lib/postgresql/data/pgdata \
  -p 6542:5432 \
  -e POSTGRES_USER="user" \
  -e POSTGRES_DB="db" \
  -e POSTGRES_PASSWORD="pass" \
  -e PGDATA=/var/lib/postgresql/data/pgdata \
  --constraint 'node.role == manager' \
  postgres

Я также ранее создал объем данных:

docker volume create pg_data

Теперь у меня есть еще одна служба, которую я хочу запустить, которая в основном представляет собой приложение Java, которое я включил в образ Docker, и я хочу подключить его к службе postgresql. Я пробовал следующие комбинации для URL:

jdbc: postgresql: //172.18.0.1: 5432 / db (docker_gwbridge)

jdbc: postgresql: //172.17.0.1: 5432 / db (docker0)

jdbc: postgresql: // локальный: 5432 / db

jdbc: postgresql: // postgresql: 5432 / БД

Есть идеи, что может сработать?


person anghel adrian    schedule 29.06.2017    source источник


Ответы (2)


Вы должны использовать рой overlay network для подключения к своей базе данных внутри режим роя.

Сначала создайте оверлейную сеть:

docker network create -d overlay mynet

Затем сделайте так, чтобы ваша postgresql служба использовала эту сеть:

docker service create --name postgresql \
  --mount ... \
  --network mynet \
  postgres

Затем не забудьте использовать ту же сеть для вашего контейнера Java-приложения:

docker service create --name myjavaapp \
  --network mynet \
  myjavaapp

Затем вы можете подключиться к своему postgresql через DNS-имя, например:

jdbc:postgresql://postgresql:5432/db

Все контейнеры службы в сети mynet (вы можете называть ее как хотите, это просто ссылка на имя) имеют записи DNS, соответствующие имени службы. Это проще, чем получать IP-адрес контейнера через docker inspect перед запуском Java-приложения.

Вы даже можете избежать publish порта -p 6542:5432 в своей службе докеров postgresql, поскольку вы, вероятно, не хотите раскрывать это другим.

Вы можете ознакомиться с официальным документом, чтобы лучше понять сети в режиме роения.

В этом SO QA также говорится о наложенной сети.

person François Maturel    schedule 30.06.2017

Вместо dst=/var/lib/postgresql/data/pgdata попробуйте цель target=/var/lib/postgresql/data

person IuryB    schedule 05.07.2021