多个docker组成共享网络,拥有一个未知的nginx主机

多个docker组成共享网络,拥有一个未知的nginx主机,docker,nginx,asp.net-core,docker-compose,Docker,Nginx,Asp.net Core,Docker Compose,我使用多个docker compose文件: 一个用于在同一网络上运行:postgres和nginx =>此容器集合应始终运行 每个asp核心网站一个(每个位于特定端口上) =>此容器通过CI/CD管道(VSTS)更新 由于Nginx在定义上游时需要知道主机名,因此如果asp核心容器未运行,则其主机名未知,则Nginx在docker compose up上抛出一个错误命令: nginx | 2018/01/04 15:59:17 [emerg] 1#1: host no

我使用多个docker compose文件:

  • 一个用于在同一网络上运行:postgres和nginx =>此容器集合应始终运行

  • 每个asp核心网站一个(每个位于特定端口上) =>此容器通过CI/CD管道(VSTS)更新

由于Nginx在定义上游时需要知道主机名,因此如果asp核心容器未运行,则其主机名未知,则Nginx在docker compose up上抛出一个错误命令:

nginx            | 2018/01/04 15:59:17 [emerg] 1#1: host not found in upstream 
"webportalstage:5001" in /etc/nginx/nginx.conf:9
 nginx            | nginx: [emerg] host not found in upstream 
 "webportalstage:5001" in /etc/nginx/nginx.conf:9
 nginx exited with code 1
显然,如果asp核心容器以前运行过,那么nginx知道主机名webportalstage,一切正常。但开始的顺序不是我所期望的

是否有任何解决方案可以在上游使用未知主机名启动nginx

这是我的nginx.conf文件:

worker_processes 4;

 events { worker_connections 1024; }

 http {
sendfile on;

upstream webportalstage {
   server webportalstage:5001;
}

server {
    listen 80;

    location / {
        proxy_pass         http://webportalstage;
        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_set_header   X-Forwarded-Host $server_name;
    }
}  
}
和两个docker组合文件: Nginx+Postgres:

version: "3"

services:
  proxy:
    image: myPrivateRepo:latest
    ports:
      - "80:80"
    container_name: nginx
    networks:
      aspcore:
        aliases:
          - nginx

  postgres:
    image: postgres:latest
    environment:
      - POSTGRES_PASSWORD=myPWD
      - POSTGRES_USER=postgres
    ports:
      - "5432:5432"
    container_name: postgres
    networks:
      aspcore:
        aliases:
          - postgres

networks:
  aspcore:
driver: bridge
version: "3"

services:

  webportal:
    image: myPrivateRepo:latest
    environment:
      - ASPNETCORE_ENVIRONMENT=Staging
    container_name: webportal
    networks:
      common_aspcore:
        aliases:
          - webportal

networks:
  common_aspcore:
    external: true
我的asp核心网站之一:

version: "3"

services:
  proxy:
    image: myPrivateRepo:latest
    ports:
      - "80:80"
    container_name: nginx
    networks:
      aspcore:
        aliases:
          - nginx

  postgres:
    image: postgres:latest
    environment:
      - POSTGRES_PASSWORD=myPWD
      - POSTGRES_USER=postgres
    ports:
      - "5432:5432"
    container_name: postgres
    networks:
      aspcore:
        aliases:
          - postgres

networks:
  aspcore:
driver: bridge
version: "3"

services:

  webportal:
    image: myPrivateRepo:latest
    environment:
      - ASPNETCORE_ENVIRONMENT=Staging
    container_name: webportal
    networks:
      common_aspcore:
        aliases:
          - webportal

networks:
  common_aspcore:
    external: true

最后,我使用extra_主机功能在我的nginx+postgres docker-compose.yml文件中定义了静态IP:

    extra_hosts:
    webportalstage: 10.5.0.20
并将相同的静态IP设置到我的asp core docker compose文件。
它可以工作,但不像我希望的那样通用。好吧,我在类似的情况下使用了以下技巧:

location / {
    set $docker_host "webportalstage";
    proxy_pass       http://$docker_host:5001;
    ...
}
我不确定它是否适用于上游,也许应该


我知道这不是最好的解决办法,但是我没有找到更好的。nginx docker compose中的
aspcore
与core docker compose配置中的
common\u aspcore
相比?是的,这很特别,但是当你用docker compose创建一个网络时,真正的网络名是:directoryName\u你服务的名称,所以我在aspcore网站中将网络称为外部网络docker用他的真名写作。我只尝试使用aspcore名称网络,但出现了一个错误,如网络不存在。如果这样做,Nxin不会崩溃吗?我的意思是,即使“webportalstage”存储在docker变量($docker\u host)中,在NGINX启动时解析行http://$docker\u host:5001时,它也会导致与我的错误相同的行为否?@Cladoo否,不是。我在一些项目中使用此解决方案。很好,我将尝试您的解决方案