Docker - доступ к контейнеру nginx с помощью nginx имя_сервера из другого контейнера - PullRequest
0 голосов
/ 29 июня 2018

У меня есть одно приложение node.js (веб-приложение) и два приложения lumen (api, customer-api), балансировка нагрузки которых выполняется контейнером nginx, прослушивающим порт 80.

Мой файл 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.

Ниже приведены настройки nginx для каждого приложения,

Веб-app.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;
  }
}

проблема

Я хочу получить доступ к контейнерам api и customer-api из контейнера веб-приложения. Проблема в том, что когда я пытаюсь curl http://nginx, я получаю ответ только из контейнера API. Есть ли способ получить доступ к контейнеру customer-api через контейнер nginx?

Что я пробовал

Когда я вручную сопоставил IP-адрес контейнера nginx (172.21.0.9) с соответствующим им именем server_name в файле / etc / hosts в контейнере веб-приложения, похоже, он работает.

Что я добавил в файл / etc / hosts в контейнере веб-приложения:

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

Есть ли другой способ добиться этого без ручного вмешательства?

1 Ответ

0 голосов
/ 26 октября 2018

Наконец-то все заработало, изменив конфигурацию nginx на customer-api.conf для прослушивания через порт 81, т.е. listen 80; до listen 81;. Теперь http://nginx разрешается до http://api:9000 и http://nginx:81 разрешается до http://customer-api:9000

...