Docker мультиконтейнерная установка с nginx. Nginx не распознает хост (хост не найден в апстриме) - PullRequest
0 голосов
/ 21 января 2020

Итак, я изучаю Docker и как упаковывать приложения в сервисы. Не уверен, что у меня все получится.

У меня есть три службы:

  1. web-server nginx сервер, который связывает порты 80 и 443 с внешним. В основном это "внешний интерфейс" приложения.
  2. app1 NodeJS приложение, которое обслуживает контент через порт 3000
  3. app2 NodeJS приложение, которое обслуживает контент через порт 3000, в основном это клон app1, и я использую его только для целей обучения.

Теперь моя идея запустить это "приложение" в prod будет заключаться в запуске docker-compose up, который запускает все службы. Это правильный способ запуска мультиконтейнерных приложений?

Моя структура репо выглядит так:

.
├── Dockerfile
├── app1
│   ├── Dockerfile
│   ├── index.js
│   ├── package-lock.json
│   └── package.json
├── app2
│   ├── Dockerfile
│   ├── index.js
│   ├── package-lock.json
│   └── package.json
├── docker-compose.yml
├── index.html
└── web-server.conf

root Dockerfile для услуги web-server. Мой docker-compose.yml выглядит следующим образом:

version: '3'
services:
  web-server:
    container_name: web-server
    build: .
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - app1
      - app2
  app1:
    container_name: app1
    build: ./app1
    restart: always
  app2:
    container_name: app2
    build: ./app2
    restart: always

Команда docker-compose up создает app1 и app2 изображений, однако она не работает на web-server изображении, поскольку nginx выдает ошибку:

host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
nginx: [emerg] host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11

web-server сервис Dockerfile

FROM nginx:alpine
EXPOSE 80

COPY ./web-server.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /var/www/html/

RUN apk add bash

RUN nginx

Содержание web-server.conf:

server {
 listen *:80;
 server_name web_server;
 root /var/www/html;

 location / {
   index index.html;
 }

 location /app1 {
   proxy_pass http://app1:3000;
   proxy_redirect off;
 }

 location /app2 {
   proxy_pass http://app2:3000;
   proxy_redirect off;
 }
}

Для меня это выглядит как конфиг для nginx выиграл не распознает http://app1 имя хоста во время сборки. Я попытался поэкспериментировать и заменил значения директив proxy_pass на localhost. Это создаст образ, который я могу запустить вместе с другими изображениями. Если я сделаю bundle exec -it web-server-image /bin/bash и попробую curl http://app1:3000, то это сработает. Если я отредактирую конфигурацию nginx, чтобы она указывала на эти URL-адреса, она начинает работать.

Так что я думаю, что добираюсь туда, но кажется, что она не распознает имена хостов при запуске docker-compose up.

Есть идеи? Мой подход правильный?

1 Ответ

1 голос
/ 21 января 2020

Если вы просто удалите две RUN строки в конце веб-сервера Dockerfile, это будет нормально работать.

Если вы посмотрите на изображения nginx Dockerfile , заканчивающийся

CMD ["nginx", "-g", "daemon off;"]

, который будет унаследован вашим изображением; вам не нужно делать ничего особенного, чтобы запускать nginx при запуске контейнера.

Между тем, в момент запуска Dockerfile последовательность сборки запускается в достаточно изолированной среде: ни один из Compose сетевое окружение настроено, другие контейнеры не обязательно работают, тома не присоединены, et c. Единственные настраиваемые параметры, которые вступают в силу, - это, в частности, параметры build:* Блок 1018 * в файле docker-compose.yml.

Итак: когда Dockerfile запускает RUN nginx, он пытается запустить nginx в среде сборки, но он не подключен к сети Compose, поэтому он терпит неудачу , Но вам вообще не нужно этого делать, потому что базовое изображение уже имеет настройку CMD nginx ..., и простое удаление этой строки исправит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...