我有一个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 /分贝
知道什么可行吗?
答案 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