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

Postgres in Docker; two instances clashing ports

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

我是运行下面两个命令一个接一个:

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。

如何防止这个问题?

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

首先,如果您需要从 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

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

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