我创建了一个托管服务器的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。
如何防止此问题?
答案 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