我想从一台服务器设置多个站点:
1. http://www.example.org => node.js-www (running on port (50000)
2. http://files.example.org => node.js-files (running on port 50001)
直到现在,我才发现在使用静态ips时,docker正在进行端口重定向。
是否可以通过主机名使用docker进行端口重定向?
我使用免费的亚马逊EC2奖励。
由于 博
修改: 我想让多个节点应用程序在同一个端口上运行,但是服务于不同的主机名。
答案 0 :(得分:3)
据我所知,docker没有内置的功能,也不应该。 要完成你想要做的事情,你可能需要某种反向代理,所以node.js或nginx会这样做。有弹性可能是个不错的选择:https://github.com/substack/bouncy
答案 1 :(得分:0)
答案 2 :(得分:0)
jwilder在GitHub上有一个名为nginx-proxy的伟大的docker项目。
这允许您通过仅将其端口80/443映射到主机而不是其他容器来创建正在执行反向代理的docker容器。然后,您所要做的就是为您创建的每个新Web容器提供一个新的环境变量VIRTUAL_HOST=some.domain.com
。
一个例子:
创建一个新的nginx-proxy容器
docker run -d -p 80:80 --net shared_hosting -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
为每个网站创建一个容器。例如:
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
您需要确保您拥有的主机在DNS中配置为指向运行docker容器的服务器。在此示例中,我将添加到/etc/hosts
文件:
echo "127.0.0.1 hello1.domain.com drupal.domain.com" >> /etc/hosts
导航至http://hello1.domain.com,然后导航至http://drupal.domain.com,并看到他们都使用端口80,但会为您提供不同的页面。
关于此服务的重要说明。正如您所注意到的,我添加了--net
参数,这是因为您希望成为共享主机(代理和网站)一部分的所有容器必须位于同一个虚拟网络上(这可以通过参数{定义} {1}}或--net
到--network
命令,特别是当您使用docker run
创建泊坞广告时,因为docker-compose
创建了自己的虚拟网络,因此不会使一个容器可由另一个人访问,因此请确保在docker-compose
文件中明确定义了网络。
希望它有所帮助。
答案 3 :(得分:0)
我知道这是一个古老的问题,但是遇到了这个问题,我想指出,有很多更清洁的方法可以执行要求的操作。由于您使用的是AWS,因此可以在Route53中让两个主机名中的每个主机名指向它们自己的负载均衡器(ELB)。然后,您可以将容器部署到ECS中,例如,在两个端口上侦听。每个负载均衡器都可以将流量重定向到适当的侦听端口。现在,您已经完成了所需的工作,并且如果您的流量变得过大或不平衡,您可以轻松地将任务分为两个不同的ECS群集,以便它们可以独立扩展。