ruby-on-rails - 在特定端口上运行Docker容器

标签 ruby-on-rails docker digital-ocean dokku

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

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

最佳答案

我在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的run命令的更多信息,请参见:https://docs.docker.com/reference/commandline/cli/#run

关于ruby-on-rails - 在特定端口上运行Docker容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350496/

相关文章:

docker - 在 “docker run”时间覆盖Dockerfile覆盖环境变量

docker - 如何从其他设备访问docker-compose中的服务

ubuntu - Elasticsearch digital ocean

django - 如何在 Digital Ocean 的源代码管理中包含 nginx 和 gunicorn 配置文件?

mysql - 链接现有域名后,DigitalOcean Droplet 上的 PHPmyAdmin 出现 404 Not Found 错误

ruby-on-rails - find_or_create上有很多直通关系

ruby-on-rails - 无方法错误 : undefined method `users' within a setup

ruby-on-rails - Rails Factory Girl "Create"没有保存记录?

ruby-on-rails - rails 3:命名空间路由的布局

nginx - 如何仅在 docker 网络中公开端口?