代码之家  ›  专栏  ›  技术社区  ›  Andy

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

  •  4
  • Andy  · 技术社区  · 9 年前

    我已经创建了一个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。

    如何防止此问题?

    3 回复  |  直到 9 年前
        1
  •  6
  •   Xiongbing Jin    9 年前

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

        2
  •  4
  •   thaJeztah    9 年前

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

    如果要从外部访问数据库,则需要交换 -第页 ; -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
    
        3
  •  1
  •   snovelli    9 年前

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

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