我有一个简单的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:[email protected]:5434/my_app
现在我启动Web服务容器,工作正常
docker run -d --name web.service --link dbs.service:dbs.service web-service:latest
不过这是问题所在。从容器内部,我无法使用端口5434连接到DB,但我可以使用端口5432连接到DB。
所以我使用登录容器
docker exec -it web.service bash
现在这个工作
pgcli postgres://my_user:[email protected]:5432/my_app
但事实并非如此
pgcli postgres://my_user:[email protected]:5434/my_app
我无法理解为什么它可以连接到5432而不是5434.有什么建议吗?
-p 5434:5432
此选项发布端口,以便从docker主机外部访问您的容器。主机将在5434上侦听并将流量路由到容器的端口5432。
但是,容器到容器的流量不会使用它。容器到容器的流量只需要一个通用的docker网络。从那里,任何容器都可以与同一网络上的任何其他容器通信。使用的端口是容器侦听端口,而不是主机上的已发布端口。您甚至不需要发布端口,以便其他容器可以访问它。