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

我有一个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 

我以前也创build了数据量:

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

任何想法可以工作?

您应该使用群集overlay network以群集模式连接到您的数据库。

首先创build覆盖networking:

 docker network create -d overlay mynet 

然后让你的postgresql服务使用这个networking:

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

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

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

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

 jdbc:postgresql://postgresql:5432/db 

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

你甚至可以在你的postgresql docker服务中避免publish端口-p 6542:5432 ,因为你可能不想把这个发布给别人。

您可以查看官方文档,以更好地了解群集模式下的networking 。

这个SO QA也谈到了覆盖networking。