【问题标题】:Postgres in Docker; two instances clashing portsDocker 中的 Postgres;两个实例冲突端口
【发布时间】:2016-07-25 13:08:29
【问题描述】:

我创建了一个承载 postgres 服务器的 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.

我觉得这有点令人困惑,因为我认为容器的目的是隔离端口绑定。如果我将两个容器都映射到主机上的同一端口上,我可以理解,但我正在尝试将它们分别挂载到 9001 和 9002。

如何防止这个问题?

【问题讨论】:

  • 是否需要暴露和重新映射端口?链接容器时可以通过主机名访问它们
  • 第一个发布的端口是在主机上,所以显然你必须改变两个中的一个
  • 不幸的是,我确实需要从外部非 docker 位置访问端口。

标签: postgresql docker port


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-07-11
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        相关资源
        最近更新 更多