子域名,Nginx-proxy和Docker-compose

时间:2017-07-31 12:54:12

标签: docker nginx docker-compose subdomain devops

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

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

快速浏览一下我目前的情况。它不能没有顶级域名,因此它可以在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容器。

3 个答案:

答案 0 :(得分:6)

不幸的是,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

您可以尝试通过不同的端口为不同的容器提供服务。 E.g:

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

答案 1 :(得分:3)

如果您已经在使用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文件以获取有关正在运行的其他容器的信息,如果它们中的任何一个设置了env变量VIRTUAL_HOST,那么它会将其添加到其配置中。

答案 2 :(得分:1)

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

它为我工作的方式:

对于apache(在容器中),我创建了两个虚拟主机:一个在端口80中,另一个在端口90中。
为了在apache2(容器)中启用端口90,必须在/etc/apache2/ports.conf

中的“ Listen 80”下方添加“ Listen 90”行。

对于NGINX(主机),在端口80中配置了两个DOMAINS,它们都在/ 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

就是我了!