如何连接到 Docker Swarm 中的 Postgresql 服务?

How to connect to Postgresql service inside 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://localhost:5432/db

jdbc:postgresql://postgresql:5432/db

知道什么可行吗?

您应该使用 swarm overlay 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

然后您可以通过 DNS 名称连接到您的 postgresql,例如:

jdbc:postgresql://postgresql:5432/db

mynet网络中所有服务的容器(你可以随便叫它,它只是一个名称引用),都有与服务名称对应的DNS条目。这比在启动 java 应用程序之前必须通过 docker inspect 检索容器的 IP 更容易。

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

你可以看看official doc to better understand networks in swarm mode

这个SO QA也讲到了overlay网络

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