【问题标题】:Hostname to docker containers mapping?主机名到 docker 容器映射?
【发布时间】:2020-05-27 02:36:24
【问题描述】:

当Apache直接安装在主机上时,我在"C:\Windows\System32\drivers\etc\hosts"添加一个内部主机名并使用虚拟主机轻松访问本地不同的项目说:http://foo.test和http://bar.test。

为每个项目使用 docker 容器,我可以通过在 docker-compose 文件中分配主机端口来访问该项目。

我希望docker可以有一些内部工具来实现通过主机名访问容器。

使用反向代理可能是这些相对较旧但精彩的文章中描述的解决方案。

但是因为我相信这是一个非常普遍的开发需求,我希望 Docker 有内置的东西来解决它。

【问题讨论】:

  • 您可以使用相同的 docker-compose 文件启动 apache 或 nginx 容器,方法是使用您声明的服务名称访问您的容器。
  • 是的,这就是我的建议。使用 nginx 或 apache 作为反向代理,通过这些端口与容器通信,并从主机使用主机名连接到 nginx 或 apache。
  • @BurakSerdar 我相信您指的是链接中解释的方式。
  • 没错。反向代理很常见。我不知道有内置解决方案。

标签: windows docker networking dns containers


【解决方案1】:

我解决这个问题的方法如下。考虑我有容器 A 和 B 都运行网络服务器。我只是在我的本地机器上添加了一个反向代理,它查看主机名,然后代理到相应的容器。

但我不是通过硬编码的 IP 地址进行代理,而是通过本地端口进行代理。因此,不要将两个容器都绑定到端口 80,而是将它们绑定到随机的本地端口(例如 4041)并通过该端口进行代理。这样你就可以将容器 IP 与主机分离。

我的 nginx 文件如下所示:

server {
    server_name example.com # Add <host lan ip> example.com to your /etc/hosts file

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;   # These two lines ensure that the
        proxy_set_header Connection "Upgrade";    # a WebSocket is used
        proxy_pass http://localhost:4041/;
    }

<snip>

添加多个容器仅意味着您必须编辑 1 个 nginx 代理文件,并将端口绑定到本地计算机。 Docker ip 和你的本地主机文件之间没有耦合。

【讨论】:

  • 感谢您尝试回答这个问题。问题不在于在 docker 网络中连接容器,而在于使用一些主机名而不是本地端口从主机运行独立项目。请查看链接。
  • 啊。我现在明白你的意思了。我会相应地改变我的答案。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多