如何使用 docker compose 和一些共享公共域的 Web 服务设置本地开发环境

问题描述 投票:0回答:1

我需要在本地设置 docker 并包含 3 个映射到子域的服务,例如:

  • nginx.app.com
  • service1.app.com
  • service2.app.com
  • service3.app.com

共享公共域(例如 *app.com)非常重要,因为我需要此设置来进行 JSESSION cookie 测试。

使用 docker compose 和 nginx docker 服务实现这样的配置是否可行?

我已经有了 docker-compose.yaml:

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
      - ./nginx/generate-certs.sh:/usr/local/bin/generate-certs.sh
    entrypoint: /bin/bash -c "/usr/local/bin/generate-certs.sh && nginx -g 'daemon off;'"
    depends_on:
      - service1
      - service2
      - service3

  service1:
    image: nginx:latest
    ports:
      - "8081:80"
    volumes:
      - ./html:/usr/share/nginx/html

  service2:
    image: nginx:latest
    ports:
      - "8082:80"
    volumes:
      - ./html2:/usr/share/nginx/html

  service3:
    image: nginx:latest
    ports:
      - "8083:80"
    volumes:
      - ./html3:/usr/share/nginx/html

和 nginx.conf:

events {
}
http {
    upstream service1 {
        server service1:80;
    }
    upstream service2 {
        server service2:80;
    }
    upstream service3 {
        server service3:80;
    }

    server {
        listen 80;
        server_name *.app.com;
        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name service3.app.com;

        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location / {
            proxy_pass http://service3;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }

    server {
        listen 443 ssl;
        server_name service1.app.com;

        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location /1 {
            proxy_pass http://service1;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }

    server {
        listen 443 ssl;
        server_name service2.app.com;

        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location /2 {
            proxy_pass http://service2;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }
    server {
        listen 443 ssl;
        server_name service3.app.com;

        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

        location /3 {
            proxy_pass http://service3;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }
}

每当我访问https://app.com时它对我很有帮助(我已将此主机添加到/etc/hosts) 但我无法从主机 - 我的电脑浏览器访问 https://service3.app.com

总结一下,我需要这样的架构:

enter image description here https://blog.florianlopes.io/host-multiple-websites-on-single-host-docker/

请指出我做错了什么。

docker nginx ssl docker-compose https
1个回答
0
投票
Docker 无法配置外部 DNS,也不会尝试像

/etc/hosts

 那样更改系统配置文件。  这种基于主机名的路由不能单独使用 Docker 来设置;您需要 Docker 之外的东西来配置这些主机名。

由于您已经有了反向代理,因此首先要尝试的就是将其所有块组合到单个 HTTP 服务中,例如

server { listen 80; location /1/ { proxy_pass http://service1; } location /2/ { proxy_pass http://service2; } location / { proxy_pass http://service3; } }
然后您就可以拨打 

例如 http://localhost/1/

 并被路由至 
service1
。  (如果该服务以某种方式构造绝对 URL,它可能需要知道它位于插入此路径前缀的代理后面。)这根本不依赖于主机名,因此您可以将其与普通 Docker(或 Compose)一起使用)而不尝试管理主机名到 IP 的映射。

您谈到需要共享 cookie 域。 在此示例中,所有内容均通过相同的主机名和端口提供,因此服务可以共享 cookie。 服务到服务的调用都不会是跨源调用(如果服务 1 的浏览器内应用程序获取

/2/info.json

,它位于同一域中),因此 CORS 规则在此设置中也无关紧要。

© www.soinside.com 2019 - 2024. All rights reserved.