我有两个正在运行的Docker容器:


一个运行Nginx的Docker容器,该容器提供Angular应用程序资源文件,这些文件已复制到docker build上的Docker映像中。
当前正在内部在容器上侦听端口5007并在主机上外部侦听端口5007的api

我正在设置临时环境和以下外部URL:


app.staging.mysite.com
account.staging.mysite.com

app.staging.mysite.com到达端口80并使用Angular应用程序资源进行响应。 />
现在我想获取account.staging.mysite.com外部API URL请求,以使我的API Docker容器在端口5007上监听。来自account.staging.mysite.com的请求将达到主机的端口80 。

Nginx将收到account.staging.mysite.com端口80请求并将它们代理到Docker容器127.0.0.1:5007,同时默认情况下仍为所有外部URL提供我的Angular应用文件/我未在Nginx配置中明确表示代理的域。

我不想使用Angular应用程序,而是希望使用Nginx将请求转发到端口5007,以便我的Account API可以响应。因此,我已将Nginx配置更改为以下内容:

upstream accountstaging{
    server 0.0.0.0:5007
}
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    # Main
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri$args $uri$args/ /index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen 80;
    server_name account.staging.mysite.com;

    location / {
        proxy_pass         http://accountstaging;
        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;
    }
}


让我真正感到惊讶的是现在没有default_server命中。换句话说,当我添加第二个服务器侦听端口80专门用于account.staging.mysite.com时,正在使用Angular应用程序资源并对其进行响应的app.staging.mysite.com不再起作用。

所以这个问题实际上与Docker容器无关,而实际上与Nginx配置有关。尽管我不能完全确定是否可以将我的Docker容器排除在问题之外。所以这是我的account.staging.mysite.com的docker-compose.yml:

version: '3'

services:
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.account.image
    container_name: tsl.api.account.container
    ports:
      - "5007:5007"
    environment: 
      ASPNETCORE_URLS: http://+:5007


这是我用于app.staging.mysite.com的docker-compose.yml:还要充当反向代理,您可以看到Nginx default_server服务器将我复制到docker build上此Docker映像中的Angular应用程序资源文件作为服务器:此问题可能是由于Angular应用程序前端docker容器的80:80绑定引起的吗?

#1 楼

多亏了这里的问题和答案,我才意识到我遇到了两个问题:


容器具有不同的默认Docker网络,因为我使用的是两个不同的docker-compose.yml文件,我已经预见到我的Ngnix代理完全独立于我的任何API容器(包括docker-compose)独立工作,第二个问题就是当我尝试代理127.0.0.1:5023时,是Ngnix容器内的本地主机,而不是Nginx代理容器外的网络

,所以docker-docker为我的Nginx代理docker容器和api docker容器创建的不同默认网络是因为我是使用两个不同的docker-compose.yml文件。这是因为我拥有针对许多API微服务的Jenkins构建,因此具有独立的docker-compose文件,并且我需要Nginx代理将端口80上的请求转发至每个微服务。对于这两个容器,API和Nginx代理,都使用docker-compose.yml: 0.1:5023,该转发保留在Nginx Docker容器中,并且从未找到在Docker主机上运行的API,我只需要使用docker-compose.yml服务名称即可:

version: '3'

services:
  reverseproxy:
    build: 
      context: ./
      dockerfile: docker/nginxproxy/docker/Dockerfile
    image: tsl.devops.reverseproxy.image
    container_name: tsl.devops.reverseproxy.container
    ports:
      - "80:80"
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.example.image
    container_name: tsl.api.example.container
    ports:
      - "5023:5023"
    environment: 
      ASPNETCORE_URLS: http://+:5023