【问题标题】:Subdomains, Nginx-proxy and Docker-compose子域、Nginx-proxy 和 Docker-compose
【发布时间】:2018-01-07 01:30:50
【问题描述】:

我正在寻找一种方法来配置 Nginx 以通过我的服务器的子域访问托管服务。这些服务和 Nginx 使用 Docker-compose 实例化。

简而言之,当输入 jenkins.192.168.1.2 时,我应该访问托管在 192.168.1.2 上的 Jenkins,并使用 Nginx 代理重定向。

快速浏览一下我目前拥有的东西。 没有顶级域名它不能工作,所以它在play-with-docker.com上工作正常,但在本地不能工作,例如192.168.1.2

server {
    server_name jenkins.REVERSE_PROXY_DOMAIN_NAME;
        location / {
            proxy_pass http://jenkins:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $host:$server_port;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
}

看看我想要什么:https://github.com/Ivaprag/devtools-compose

我的总体目标是在不修改客户端 DNS 服务的情况下访问远程 docker 容器。

【问题讨论】:

    标签: docker nginx docker-compose subdomain devops


    【解决方案1】:

    不幸的是,nginx 不支持这样的 IP 地址上的子域。

    您要么必须修改客户端主机文件(您说过不想这样做)...


    或者你可以像这样设置你的 nginx 重定向:

    location /jenkins {
        proxy_pass http://jenkins:8080;
        ...
    }
    
    location /other-container {
        proxy_pass http://other-container:8080;
    }
    

    这将允许您通过 192.168.1.2/jenkins 访问 jenkins


    或者您可以尝试通过不同的端口为您的不同容器提供服务。例如:

    server {
        listen 8081;
        location / {
            proxy_pass http://jenkins:8080;
            ...
        }
    }
    
    server {
        listen 8082;
        location / {
            proxy_pass http://other-container:8080;
            ...
        }
    }
    

    然后从192.168.1.2:8081/访问jenkins

    【讨论】:

    • 谢谢,我已经尝试过你的建议,但它不起作用,我连接到 192.168.1.2/jenkins 时出现 404 错误......我想我得修改 hosts 文件
    • 错误终于是覆盖地址了,我去192.162.1.2/jenkins的时候得到了192.168.1.2/login?from=%2Fjenkins。我会尝试更多的东西
    • 是的,看起来詹金斯正在重定向东西。我已经用不同的可能解决方案编辑了答案。让我知道这是否有帮助
    • 对每个服务使用不同的端口是可行的!我记得我已经尝试过这个解决方案,但是使用端口 80 到 90,我没有工作。非常感谢伙计!
    • 您能否举个例子,说明这将如何像标题中那样与 docker-compose 挂钩?
    【解决方案2】:

    如果你已经在使用 docker-compose,我推荐使用 jwilder nginx-proxy 容器。

    https://github.com/jwilder/nginx-proxy

    这允许您在定义的 nginx 代理的后端添加无限数量的 Web 服务容器,例如:

    nginx-proxy:
      image: jwilder/nginx-proxy
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - "/etc/nginx/vhost.d"
        - "/usr/share/nginx/html"
        - "/var/run/docker.sock:/tmp/docker.sock:ro"
        - "nginx_certs:/etc/nginx/certs:rw"
    nginx:
      build:
       context: ./docker/nginx/
       dockerfile: Dockerfile
      volumes_from:
         - data
      environment:
         VIRTUAL_HOST: www.host1.com
    nginx_2:
      build:
       context: ./docker/nginx_2/
       dockerfile: Dockerfile
      volumes_from:
         - data
      environment:
         VIRTUAL_HOST: www.host2.com
    apache_1:
      build:
       context: ./docker/apache_1/
       dockerfile: Dockerfile
      volumes_from:
         - data
      environment:
         VIRTUAL_HOST: www.host3.com
    

    nginx-proxy 挂载主机 docker sock 文件以获取有关正在运行的其他容器的信息,如果它们中的任何一个设置了环境变量 VIRTUAL_HOST,那么它会将其添加到其配置中。

    【讨论】:

      【解决方案3】:

      我试图在 nginx(主机)中为一个 LXC 容器中的两个虚拟主机配置子域。

      它对我有用的方式:

      对于 apache(在容器中),我创建了两个虚拟主机:一个在 80 端口,另一个在 90 端口。
      要在 apache2(容器)中启用端口 90,需要在 /etc/apache2/ports.conf 中的“Listen 80”下方添加“Listen 90”行

      对于 NGINX(主机),配置了两个 DOMAINS,都在端口 80 中,在 /etc/nginx/sites-available 中创建独立的 .conf 文件。为每个文件创建符号链接到 /etc/nginx/sites-enabled。

      在第一个 NGINX myfirstdomain.conf 文件中,重定向到 http://my.contai.ner.ip:80

      在第二个 NGINX myseconddomain.conf 文件中,重定向到 http://my.contai.ner.ip:90

      这就是给我的!

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 2020-07-23
        • 2021-02-15
        • 2018-04-24
        • 2020-12-31
        • 1970-01-01
        相关资源
        最近更新 更多