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

我创build了一个托pipepostgres服务器的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 

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

 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。

我如何防止这个问题?

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

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

如果打算从外部访问数据库,则需要交换-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 

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

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