Docker中的Postgres;两个实例冲突端口

时间:2016-04-05 14:15:25

标签: postgresql docker port

我创建了一个托管服务器的docker容器。我正在尝试获取这个运行的两个实例,它们索引两个完全不同的数据库,因此依赖于一组不同的卷。

我一个接一个地运行以下两个命令:

docker run -v ... -p 5432:9001 -P --name psql-data postgres-docker
docker run -v ... -p 5432:9002 -P --name psql-transactions postgres-docker

创建并运行第一个容器,但第二个调用会引发以下错误:

Error response from daemon: failed to create endpoint psql-transactions on network bridge: Bind for 0.0.0.0:5432 failed.  Port already in use.

我发现这有点令人困惑,因为我虽然容器的意思是隔离端口绑定。我能理解我是否有两个容器将5432映射到主机上的同一端口,但我试图将它们分别安装到9001和9002。

如何防止此问题?

3 个答案:

答案 0 :(得分:4)

首先,如果您需要从Docker主机外部访问它们,则只发布(-p)端口;如果数据库仅由容器中运行的其他服务使用,则不需要发布端口;容器可以通过docker网络访问数据库。

如果您打算在外部访问数据库,则需要交换-p中端口的顺序; -p <host-port>:<container-port>。所以在你的情况下;

docker run -v ... -p 9001:5432-P --name psql-data postgres-docker
docker run -v ... -p 9002:5432 -P --name psql-transactions postgres-docker

答案 1 :(得分:1)

应该颠倒端口的顺序。它应该是-p host_port:container_port

答案 2 :(得分:1)

要避免端口冲突,您需要像这样运行它:

docker run -v ... -p 9001:5432 -P --name psql-data postgres-docker
docker run -v ... -p 9002:5432 -P --name psql-transactions postgres-docker