在子域名上运行Docker

3
我的目标是部署多个Web应用程序,并通过子域名访问它们。我目前将它们运行在不同的端口上,服务器上有nginx,容器正在运行apache。
docker run -p 8001:80 -d apache-test1
docker run -p 8002:80 -d apache-test2

我可以通过访问它们来使用它们,只需要去到

http://example.com:8001

或者http://example.com:8002

但我更喜欢通过子域名来访问它们。

http://example.com:8001 -> http://test1.example.com
http://example.com:8002 -> http://test2.example.com

我在服务器上运行了nginx,并使用以下服务器设置。
server {
    server_name test1.anomamedia.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host ;
        proxy_set_header X-Real-IP $remote_addr ;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
        proxy_pass http://localhost:8001;
    }
}

server {
    server_name test2.anomamedia.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host ;
        proxy_set_header X-Real-IP $remote_addr ;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
        proxy_pass http://localhost:8002;
    }
}

如果有帮助的话,这是我的Dockerfile。
FROM ubuntu

RUN apt-get update
RUN apt-get -y upgrade

RUN sudo apt-get -y install apache2 php5 libapache2-mod-php5

# Install apache, PHP, and supplimentary programs. curl and lynx-cur are for debugging the container.
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 libapache2-mod-php5 php5-mysql php5-gd php-pear php-apc php5-curl curl lynx-cur

# Enable apache mods.
RUN a2enmod php5
RUN a2enmod rewrite

EXPOSE 80

# Copy site into place.
ADD html /var/www/html

# Update the default apache site with the config we created.
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf

# By default, simply start apache.
CMD /usr/sbin/apache2ctl -D FOREGROUND

实际上问题是什么? - Mykola Gurov
子域名部分不起作用,它在问题中... - santi6291
在 https://meta.discourse.org/t/how-do-you-go-on-configuring-another-sub-domain-with-the-nginx-instance-inside-the-docker/16846/16 中,您可以尝试使用 proxy_pass http://0.0.0.0:8002; (而不是 localhost)进行配置。 - VonC
我在http://blog.manugarri.com/how-to-easily-set-up-subdomain-routing-in-nginx/中看到,`X-Real-IP`和`X-Forwarded-For`都指向同一个远程URL。虽然https://github.com/jwilder/nginx-proxy/issues/130#issue-63797536是一篇不错的文章/值得测试:https://github.com/jwilder/nginx-proxy可以为您生成正确的参数。 - VonC
2个回答

2
我有类似的问题。我经常需要添加和删除容器,所以不想每次都编辑nginx配置文件。我的解决方案是使用jwilder/nginx-proxy。
然后,您只需使用公开端口(--expose 80,而不是-p 80:80)启动容器并添加环境变量:
-e VIRTUAL_HOST=foo.bar.com

不要忘记使用正确的标头将主要的nginx流量转移:

server {
    listen       80;# default_server;
    #send all subdomains to nginx-proxy
    server_name  *.bar.com;

    #proxy to docker nginx reverse proxy
    location / {
        proxy_set_header   X-Real-IP $remote_addr; #for some reason nginx 
        proxy_set_header   Host      $http_host;   #doesn't pass these by default
        proxy_pass         http://127.0.0.1:5100;
    }

}                    

1
谢谢,最终我使用了jwilder/nginx-proxy哈哈,这是一个很棒的容器。 - santi6291

0

请查看 nginx-proxy 项目(https://github.com/jwilder/nginx-proxy)。我在我的博客中编写了一篇教程,演示了如何使用它来实现您想要的功能:https://blog.florianlopes.io/host-multiple-websites-on-single-host-docker

该工具会自动将请求转发到适当的容器(基于子域名通过 VIRTUAL_HOST 容器环境变量)。

例如,如果您想通过 test1.example.com 访问您的容器,只需将 VIRTUAL_HOST 容器环境变量设置为 test1.example.com


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