首页 > 解决方案 > 主机名到 docker 容器的映射?

问题描述

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

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

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

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

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

标签: windowsdockernetworkingdnscontainers

解决方案


我解决这个问题的方法如下。考虑我有容器 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 和您的本地主机文件之间没有耦合。


推荐阅读