首页 > 解决方案 > Docker - 使用来自另一个容器的 nginx server_name 访问 nginx 容器

问题描述

我有一个 node.js 应用程序(web-app)和两个 lumen 应用程序(api、customer-api),它们由监听端口 80 的 nginx 容器进行负载平衡。

我的 docker-compose.yml 文件:

version: '2'
services:
  nginx:
    build:
      context: ../
      dockerfile: posbytz-docker/nginx/dockerfile
    volumes:
      - api
      - customer-api
    ports:
      - "80:80"
    networks:
      - network
    depends_on:
      - web-app
      - api
      - customer-api
  web-app:
    build:
      context: ../
      dockerfile: posbytz-docker/web-app-dockerfile
    volumes:
      - ../web-app:/posbytz/web-app
      - /posbytz/web-app/node_modules
    ports:
      - "3004:3004"
    networks:
      - network
  api:
    build:
      context: ../
      dockerfile: posbytz-docker/api-dockerfile
    volumes:
      - ../api:/var/www/api
    networks:
      - network
  customer-api:
    build:
      context: ../
      dockerfile: posbytz-docker/customer-api-dockerfile
    volumes:
      - ../customer-api:/var/www/customer-api
    networks:
      - network
  redis:
    image: redis
    ports:
      - "6379:6379"
    networks:
      - network
  memcached:
    image: memcached
    ports:
      - "11211:11211"
    networks:
      - network
  mysql:
    image: mysql:5.7
    volumes:
      - ./db-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - network
  adminer:
    image: adminer
    restart: always
    ports:
      - "9001:8080"
    networks:
      - network
networks:
  network:
    driver: bridge

由于我使用的是桥接网络,因此我可以使用容器名称从另一个容器访问每个容器。但我想要的是,使用它们的 nginx 配置的 server_name 访问容器。

下面是每个应用程序的nginx配置,

网络应用程序.conf:

server {
  listen 80;
  server_name posbytz.local;
    resolver 127.0.0.11 valid=10s;

  location / {
    proxy_pass http://web-app:3004;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

api.conf:

server {
  listen 80;
  index index.php index.html;
  root /var/www/api/public;
  server_name api.posbytz.local;
    resolver 127.0.0.11 valid=10s;

  location / {
    try_files $uri /index.php?$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass api:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

客户-api.conf

server {
  listen 80;
  index index.php index.html;
  root /var/www/customer-api/public;
  server_name customer-api.posbytz.local;
    resolver 127.0.0.11 valid=10s;

  location / {
    try_files $uri /index.php?$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass customer-api:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

问题

我想从 web-app 容器访问 api 和 customer-api 容器。问题是当我尝试时,我curl http://nginx只得到来自 api 容器的响应。有没有办法通过nginx容器访问customer-api容器?

我试过的

当我在 web-app 容器的 /etc/hosts 文件中手动映射 nginx 容器(172.21.0.9)的 IP 和它们各自的 server_name 时,它​​似乎可以工作。

我在 web-app 容器的 /etc/hosts 文件中添加的内容:

172.21.0.9  api.posbytz.local
172.21.0.9  customer-api.posbytz.local

有没有其他方法可以在没有人工干预的情况下实现这一目标?

标签: dockernginxdocker-composelumen

解决方案


最后通过更改 customer-api.conf 上的 nginx 配置以侦听端口 81 即使其工作。listen 80;listen 81;. 现在http://nginx解决http://api:9000http://nginx:81解决http://customer-api:9000


推荐阅读