Как докернизировать nginx и другой сервер в отдельных файлах docker-compose? - PullRequest
0 голосов
/ 11 января 2019

У меня есть приложениеactjs, которое я хочу сервировать через nginx. Приложение отправляет запросы API на сервер node.js Express. Я решил объединить nginx вместе со статическими файлами веб-сайта (из приложения activjs) в один файл docker-compose. Я создал другой файл docker-compose для сервера Express. Контейнеры в настоящее время на моем ноутбуке и используют localhost. Я не мог заставить их работать в течение длительного времени, и, к сожалению, в Интернете не так много информации об этом. (веб-сайт и сервер Express работают, когда нет внутри Docker).

Прежде всего я создал новую сеть докеров:

docker network create --driver bridge appstore-net

Это мой docker-compose файл для сайта и nginx:

version: '3.5'

services:
  appstore-front:
    container_name: appstore-front-production
    build:
      context: .
      dockerfile: Dockerfile-prod
    ports:
      - '80:80'
    networks:
      - appstore-net
    external_links:
      - appstore-bl-server-production

networks:
  appstore-net:
    external: true

Это мой файл docker-compose для сервера Express:

version: '3'
services:
  appstore-bl-server:
    container_name: appstore-bl-server-production
    build:
      dockerfile: Dockerfile-prod
      context: .
    volumes:
      - ".:/usr/src/app"
    ports:
      - "3000:3000"
    networks:
      - appstore-net

networks:
  appstore-net:
    external: true

Это моя конфигурация nginx:

server {
  listen 80;
  listen [::]:80;

  #Docker DNS
  resolver 127.0.0.11;

  server_name localhost;
  access_log /var/log/nginx/appstore.access.log;
  error_log /var/log/nginx/appstore.error.log;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  location /api {
      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;

      #hack to prevent nginx to resolve container's host on start up
      set $docker_host "appstore-bl-server";
      proxy_pass http://$docker_host:3000;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

Как вы видите, я использую средство распознавания DNS для докера, а также создаю "передачу прокси" на URL, состоящий из имени контейнера Express.

Как я могу заставить это работать?


РЕДАКТИРОВАТЬ: Я нашел 2 проблемы, которые могли быть причиной:

1) external_links должен ссылаться на имя контейнера, а не на службу контейнера.

2) docker_host переменная в nginx должна ссылаться на имя службы, а не на имя контейнера.

С этими исправлениями настройка работает (также исправлены значения в OP).

...