【问题标题】:How to fire up all docker containers on a same local ip address in django?如何在 django 中启动同一本地 IP 地址上的所有 docker 容器?
【发布时间】:2018-12-29 01:38:15
【问题描述】:

我正在使用 docker 编写一个基于 django 的应用程序,其中有 3 个项目应用程序在不同的容器中运行。所有 django 应用程序都运行在0.0.0.0:8000

但是当我在浏览器中检查容器的 ip 地址以浏览应用程序时,它们都运行在不同的 ip 地址:

project1 在172.18.0.10:8000 运行,可以访问:172.18.0.10:8000/app1 project2 在172.18.0.9:8000 运行,可以在以下位置访问:172.18.0.9:8000/app2 project3 运行在172.18.0.7:8000 可以访问:172.18.0.7:8000/app3

这使我的应用程序的超链接无法使用。如何在一个 ip 'localhost:8000' 上运行所有容器?

有什么建议我哪里出错了吗?

【问题讨论】:

  • 您必须使用单个容器。使用 3 个不同的容器时不能使用一个 ip
  • 你必须为每个容器docker run -p一个不同的端口;你不能在同一个端口、Docker 或其他地方运行三个不同的服务。 Docker 内部 IP 地址没有用(它们会在您重新启动容器时更改,并且在其他主机上不可见);不要费心查找它们。
  • 无论如何我可以将我的本地主机映射到所有 3 个 ip。然后我可以在浏览器中只使用我的本地主机吗?
  • 为什么不使用docker-compose 来统一所有这些应用程序/容器并为它们分配不同的端口?您可以在 localhost 中端口转发这些端口。
  • 因为在 docker-compose 中更改端口会搞砸我在实际服务器中的 CI/CD。

标签: django docker docker-compose ip


【解决方案1】:

你设计错了,将多个容器映射到一个 ip+port 是根本不可能的。一个ip上的一个端口永远是一个监听的应用,不管是不是容器应用。

简单证明:然后谁来决定将请求发送到哪个容器?对他们所有人?那么谁来决定哪个响应是正确的呢?这就是 IP 地址和端口的用途,以便能够向特定机器上的特定应用程序发送请求。

我认为你应该重新考虑你在做什么,并且对网络做更多的研究。有几个在线课程。 (我不想以任何方式劝阻你,只是为你瞄准正确的方向)

无需重新设计您的应用程序的简单解决方案就是在您的应用程序前面放置反向代理(例如 nginx)。这就是我反问的回答。反向代理可以是一个中间人,可以根据 ip/port 以外的其他内容决定向哪个应用程序发送请求。反向代理侦听某些特定端口,然后根据您提供给它的规则(例如基于路径),可以将请求代理到特定的应用程序/IP/端口并代理返回。

但在这种情况下,反向代理与其说是正确的解决方案,不如说是一种技巧,请记住这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多