【问题标题】:Running Docker container on a specific port在特定端口上运行 Docker 容器
【发布时间】:2014-08-17 15:12:29
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我对 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

    【讨论】:

    • 感谢您的贡献!那么在特定端口上运行 Postgres 容器的命令是什么? -P--expose 端口有什么区别?现在我有一个在 0.0.0.0:49156-&gt;5432 上运行的 Postgres 图像,我希望它是 0.0.0.0:49168-&gt;5432,命令是什么?
    • --expose,你告诉 docker 你想在特定容器的端口上接收连接。 -P,您想将所有暴露的容器端口映射到主机端口。要映射到不能使用-P 的不同端口,必须使用-psudo docker --expose=5432 -p=49156:5432 &lt;IMAGE&gt; &lt;COMMAND&gt;
    • @RogerAlmeida -p=YYYY:XXXX 是否暗示 --expose 端口 XXXX ?
    • @RogerAlmeida 我的图片如下所示:IMAGE: postgresql/blog:latest, COMMAND: /usr/bin/start_pgsql, PORT: 0.0.0.0:49156-&gt;5432/tcp。所以我想把端口改成49168。docker run -p=49168:5432 postgresql/blog:latest /usr/bin/start_pgsql返回stat /usr/bin/start_pgsql: no such file or directory
    猜你喜欢
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多