Docker端口与另一个容器内部不匹配

时间:2018-01-02 19:34:08

标签: postgresql docker

我有一个简单的2个docker容器设置,一个用于数据库,另一个用于Web服务。

我像这样启动DB docker容器:

docker run -d --name dbs.service -p 5434:5432 -e POSTGRES_DB=my_app -e POSTGRES_USER=my_user -e POSTGRES_PASSWORD=my_password postgres:9.6.2

这很好用。从localhost,我也可以很好地连接到它(使用pgcli进行连接)

pgcli postgres://my_user:my_password@dbs.service:5434/my_app

现在我启动了web服务容器,它工作正常

docker run -d --name web.service --link dbs.service:dbs.service web-service:latest

然而,这是问题所在。从容器内部,我无法使用端口 5434 连接到数据库,但我可以使用端口 5432 连接到数据库。

所以我使用

登录容器
docker exec -it web.service bash

现在可行了

pgcli postgres://my_user:my_password@dbs.service:5432/my_app

但这不是

pgcli postgres://my_user:my_password@dbs.service:5434/my_app

我无法理解为什么它可以连接到5432而不是5434.有任何建议吗?

1 个答案:

答案 0 :(得分:4)

-p 5434:5432

此选项发布端口,以便从docker主机外部访问您的容器。主机将侦听​​5434并将流量路由到容器的端口5432.

但是,容器到容器的流量不会使用它。容器到容器的流量只需要一个公共的docker网络。从那里,任何容器都可以与同一网络上的任何其他容器通信。使用的端口是容器侦听端口,而不是主机上的已发布端口。您甚至不需要发布端口,以便其他容器可以访问它。