Интерфейс не может достигнуть внутреннего порта в отдельных docker контейнерах - PullRequest
0 голосов
/ 12 февраля 2020

Мое приложение веб-интерфейса находится за NGINX, которое обслуживает стандартные файлы c интерфейса (записанные в Angular) в контейнере docker, порт связи - 80:80.

Моим бэкэнд-приложением является Nest JS, которое обслуживает данные на порте localhost: 3000 в другом docker контейнере.

Запуск приложения с docker -созданием, но мой интерфейс не может достичь бэкэнда - получить 502, плохой GW.

Проблема вызвана настройкой nginx или docker -compose.yml или обоих?

Внешний интерфейс Dockerfile:

FROM node:latest AS builder

WORKDIR /app
COPY . .
ARG configuration=production
RUN npm install && npm run build.prod

FROM nginx:latest
LABEL version="1.0"

COPY nginx.conf /etc/nginx/nginx.conf

WORKDIR /usr/share/nginx/html
COPY --from=builder /app/dist/frontend/ .

Бэкэнд Dockerfile:

FROM node:10 AS builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
ADD . /app
EXPOSE 3000
CMD ["npm", "run", "start:prod"]

NGINX .conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        server_name  localhost;

        root   /usr/share/nginx/html;
        index  index.html index.htm;
        include /etc/nginx/mime.types;

        gzip on;
        gzip_min_length 1000;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
            try_files $uri $uri/ /index.html;
        }

        location /api {
            proxy_pass http://127.0.0.1:3000;
        }

        location ~ \.html$ {
          add_header Cache-Control "private, no-cache, no-store, must-revalidate";
          add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT";
          add_header Pragma no-cache;
        }
    }
}

docker -compose.yml

version: '3'

services:
  angular:
    image: "docker-frontend:v3"
    container_name: "frontend"
    ports:
      - "80:80"
    links:
      - restapi

  restapi:
    image: "docker-backend:v1"
    container_name: "backend"
    expose: 
      - 3000
    ports:
      - "3000:3000"

1 Ответ

3 голосов
/ 12 февраля 2020

Вы не можете использовать localhost внутри контейнера для подключения к другому контейнеру, для этого вы можете использовать имя вашего контейнера

, например,

http://localhost:3000/api/

будет

http://backend:3000/api/
...