我有一个简单的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.有任何建议吗?
答案 0 :(得分:4)
-p 5434:5432
此选项发布端口,以便从docker主机外部访问您的容器。主机将侦听5434并将流量路由到容器的端口5432.
但是,容器到容器的流量不会使用它。容器到容器的流量只需要一个公共的docker网络。从那里,任何容器都可以与同一网络上的任何其他容器通信。使用的端口是容器侦听端口,而不是主机上的已发布端口。您甚至不需要发布端口,以便其他容器可以访问它。