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

时间:2017-06-29 21:09:14

标签: java postgresql docker jdbc 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

我之前也创建了数据卷:

docker volume create pg_data

现在,我有另一个我想要启动的服务,它基本上是一个捆绑到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 /分贝

     

JDBC:在PostgreSQL://的PostgreSQL:5432 /分贝

知道什么可行吗?

2 个答案:

答案 0 :(得分:6)

您将使用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也谈到了覆盖网络。

答案 1 :(得分:0)

而不是 id | session | results1 | results2 | results3 1 1 BCE GOOG TSLA 1 2 S&P ARKK TSLA 尝试目标 dst=/var/lib/postgresql/data/pgdata