如何连接到 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
我有一个 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