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

ang*_*ian 5 java postgresql jdbc docker docker-swarm-mode

我有一个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
Run Code Online (Sandbox Code Playgroud)

我之前也创建过数据卷:

docker volume create pg_data
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个我想要启动的服务,它基本上是一个捆绑到Docker镜像中的Java应用程序,我想将它连接到postgresql服务.我为网址尝试了以下组合:

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/DB

知道什么可行吗?

Fra*_*rel 7

您应该使用swarm overlay network在swarm模式下连接到数据库.

首先创建覆盖网络:

docker network create -d overlay mynet
Run Code Online (Sandbox Code Playgroud)

然后让您的postgresql服务使用此网络:

docker service create --name postgresql \
  --mount ... \
  --network mynet \
  postgres
Run Code Online (Sandbox Code Playgroud)

然后,不要忘记为Java应用程序容器使用相同的网络:

docker service create --name myjavaapp \
  --network mynet \
  myjavaapp
Run Code Online (Sandbox Code Playgroud)

然后,您可以连接到您的postgresqlDNS名称,如:

jdbc:postgresql://postgresql:5432/db
Run Code Online (Sandbox Code Playgroud)

网络中的所有服务容器mynet(您可以根据需要调用它,它只是一个名称引用),具有与服务名称对应的DNS条目.这比docker inspect在启动Java应用程序之前检索容器的IP更容易.

您甚至可以避免在postgresql docker服务中使用该publish端口-p 6542:5432,因为您可能不希望将此公开给其他人.

您可以查看官方文档以更好地了解群集模式中的网络.

SO QA还讨论了覆盖网络.