5

我有一个带有 3 个服务器(1 个管理器和 2 个工作人员)的 Docker Swarm 集群设置。

我使用以下命令启动了 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://localhost:5432/db

jdbc:postgresql://postgresql:5432/db

知道什么可以工作吗?

4

2 回答 2

8

您将使用 swarmoverlay network在 swarm 模式下连接到您的数据库。

首先创建覆盖网络:

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条目。这比docker inspect在启动 Java 应用程序之前必须检索容器的 IP 更容易。

您甚至可以避免使用 postgresql docker 服务中的publish端口-p 6542:5432,因为您可能不想将其暴露给其他人。

您可以查看官方文档以更好地了解 swarm 模式下的网络

这个SO QA还讨论了覆盖网络。

于 2017-06-30T07:19:46.087 回答
0

而不是dst=/var/lib/postgresql/data/pgdata尝试目标target=/var/lib/postgresql/data

于 2021-07-05T18:43:43.650 回答