我想我终于掌握了Docker的工作方式,所以我为下一步做好了准备:将一大堆不相关的应用程序塞进一个单一的服务器中,只需一个公共IP。比如说,我有许多基于Apache2-VHost的遗留网站,所以我能想到的最好的办法是运行一个LAMP容器来复制当前的情况,并在以后进行改进。为了论证,这里是我在172.17.0.2:80有一个容器
http://www.foo.com
http://blog.foo.com
http://www.bar.com
非常简单:发布端口80让我可以正确访问所有这些网站。接下来,我需要运行两个服务,所以我构建了两个容器
service-a -> 172.17.0.3:3000
service-b -> 172.17.0.4:5000
一切都很好,我可以私下从我的docker主机访问这些服务。如果我想仅通过service-a
公开限制对service-a.bar.com:80
的访问权限,而仅通过service-b
公开限制对www.foo.com:5000
的访问权限,则会出现问题。很多阅读之后,似乎我必须创建一个可怕的人工制品,称为代理或反向代理,以使事情更加混乱。我不知道我在做什么,所以我首先进入nginx - 这是我之前从未使用过的 - 因为有人告诉我它在处理许多小任务和请求时比Apache更好 - 不是我请注意,我知道如何将Apache变成代理。无论如何,nginx听起来非常适合需要将请求传递到另一台服务器的东西,所以我开始阅读文档并且我生成了以下内容(除了正确工作的虚拟主机):
upstream service-a-bar-com-80 {
server 172.17.0.3:3000;
}
server {
server_name service-a.bar.com;
listen 80;
location / {
proxy_pass http://service-a-bar-com-80;
proxy_redirect off;
}
}
upstream www-foo-com-5000 {
server 172.17.0.4:5000;
}
server {
server_name www.foo.com;
listen 5000;
location / {
proxy_pass http://www-foo-com-5000;
proxy_redirect off;
}
}
这有点奏效,直到我访问http://blog.bar.com:5000,然后显示service-b
。所以,我的问题是:我做错了什么?
答案 0 :(得分:0)
nginx
(与Apache一样)总是有一个给定ip +端口组合的默认服务器。您只有一台服务器在端口5000上侦听,因此它是端口5000上服务的事实默认服务器。
所以blog.bar.com
(我认为它解析为与www.foo.com
相同的IP地址)将使用端口5000的默认服务器。
如果要阻止该服务器块作为端口5000的默认服务器,请使用相同的端口设置另一个服务器块,并使用default_server
关键字对其进行标记,如下所示:
server {
listen 5000 default_server;
root /var/empty;
}
您可以使用多种技术来呈现服务器无法访问。
有关详情,请参阅this document。