通过主机名将端口重定向到Docker容器

7
我希望您能在一台服务器上设置多个站点:
1. http://www.example.org => node.js-www (running on port (50000)
2. http://files.example.org => node.js-files (running on port 50001)

到目前为止,我只发现在使用静态IP时才能使docker进行端口重定向。

实际上,可以通过主机名使用docker进行端口重定向吗?

我使用的是免费的Amazon EC2实例。

谢谢 Bo

编辑: 我希望能够在同一端口上运行多个节点应用程序,但服务于不同的主机名。


你能更详细地描述一下你想做什么吗?我的想象力很丰富,不确定该如何回答。目前,我会说这是一个 DNS 配置问题——只是猜测。 - Eric Platon
@EricPlaton 请查看更新 - bodokaiser
1
谢谢。这假设Docker可以基于主机名隔离流量。嗯,很有兴趣,但我宁愿将其委托给Apache虚拟主机或Nginx服务器。思考如何在Docker中实现...暂时先不要了。 - Eric Platon
请查看https://dev59.com/QmMl5IYBdhLWcg3wVlpf#23975934。 - Thomasleveil
4个回答

5
在GitHub上有一个名为 jwilder 的 nginx-proxy 项目,这是一个非常好的Docker项目。它可以创建一个反向代理的 Docker 容器,只需将其端口80/443与主机映射,而不是其他容器。接下来,每当您创建一个新的 Web 容器时,只需提供一个新的环境变量 VIRTUAL_HOST=some.domain.com 即可。
例如:
  1. Create a new nginx-proxy container

    docker run -d -p 80:80 --net shared_hosting -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
    
  2. Create a container for each website. For example:

    docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=hello1.domain.com tutum/hello-world
    docker run -d -p 80 --net shared_hosting -e VIRTUAL_HOST=drupal.domain.com drupal
    
  3. You need to make sure that the hosts you own, configured in DNS to point to the server that runs the docker container. In this example, I will add the to the /etc/hosts file:

    echo "127.0.0.1 hello1.domain.com drupal.domain.com" >> /etc/hosts
    
  4. Navigate to http://hello1.domain.com and then to http://drupal.domain.com, and see that they both use port 80 but give you a different pages.

关于此服务的重要提示。如您所见,我已添加--net参数,这是因为您想让所有容器成为共享托管(代理和网站)的一部分时,必须在同一虚拟网络上(可以通过--net--network参数定义到docker run命令中),尤其是当您使用docker-compose创建Docker时,因为docker-compose会创建自己的虚拟网络,这样会导致一个容器无法访问另一个容器,因此请确保在docker-compose.yml文件中明确定义网络。
希望能对您有所帮助。

4
据我所知,Docker没有内置此功能,也不应该有。 要实现您想要的功能,您可能需要某种反向代理,因此node.js或nginx会很好。Bouncy可能是一个不错的选择:https://www.npmjs.com/package/bouncy

1

0

我知道这是一个老问题,但是我遇到了它,并想指出有更简洁的方法来完成所需的操作。由于您正在使用AWS,因此可以将您的两个主机名分别指向Route53中自己的负载均衡器(ELB)。然后,您可以将容器部署到ECS中,例如,侦听两个端口。这些负载均衡器可以将流量重定向到适当的侦听端口。现在,您已经实现了您想要的功能,如果您的流量变得过重或不平衡,您可以轻松地将任务拆分为两个不同的ECS集群,以便它们可以独立扩展。


负载均衡器不便宜。当试图将成本保持极低时,仅使用DNS的本地选项是非常明智的选择。 - srmark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接