1

我在 DigitalOcean 上使用 Dokku 部署了一个 Rails 应用程序。我创建了一个 Postgres 数据库并将其与 Rails 应用程序链接。在我重新启动 droplet 之前,一切正常。我发现应用程序停止工作是因为重新启动每个 Docker 容器都会获得一个新端口,而 Rails 应用程序无法连接到它。如果我运行dokku postgresql:info myapp它会显示旧端口,但它已经改变了。如果我手动更改 database.yml 并将其推送到 dokku 存储库,一切正常。

那么如何防止Docker在每次服务器重启时分配不同的端口呢?或者也许有一个选项可以更改正在运行的容器的端口。

4

1 回答 1

3

我对 Dokku 没有太多经验,但对于 docker 来说,没有 A 容器的端口这样的东西。在 docker 中,您可以公开容器的端口以接收传入请求并将其映射到主机中的特定端口。例如,您可以在容器中运行您的 postgres 并告诉 docker 您要公开 5432(默认 postgresql 端口)以接收传入请求:

sudo docker run --expose=5432 -P <IMAGE> <COMMAND>

--expose=5432告诉 docker 公开端口 5432 以接收来自外部世界的传入连接。该-P标志告诉 docker 将容器中所有公开的端口映射到主机的端口。有了它,您可以连接到指向主机 ip:port 的 postgres。如果要将容器的端口映射到不同的主机端口,可以使用 -p 标志:

sudo docker run --expose=5432 -p=666 <IMAGE> <COMMAND>

不确定这是否可以帮助您处理 Dokku 环境,但我希望如此。有关 docker 的运行命令的更多信息,请参阅:https ://docs.docker.com/reference/commandline/cli/#run

于 2014-08-17T21:36:02.203 回答