Используйте Traefik с Docker Compose, чтобы обслуживать 2 сервиса на одном хосте, но разные маршруты - PullRequest
0 голосов
/ 06 августа 2020

У меня 2 внешних приложения, оба обслуживаются Nginx в порту 80

  1. app-login
  2. app-contacts

I Я пытаюсь настроить Traefik с помощью Docker Compose, чтобы добиться этого:

  • Оба приложения обслуживаются на одном хосте (например, ab c .com или localhost: 4000)
  • app-login будет доступен с localhost: 4000 / login (или ab c .com / login)
  • app-contacts будет доступен с localhost: 4000 / contacts (или ab c. com / contacts)

Но проблема в том, что он не работает с тем, что я делал до сих пор.

Ниже приведены 2 Dockerfile из 2 приложений и docker-compose.yml

app-login Dockerfile:

# build stage
FROM node:lts-alpine as build-stage

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

# production stage
FROM nginx:stable-alpine as production-stage

COPY --from=build-stage /app/dist /usr/share/nginx/html

EXPOSE 80

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

app-contacts Dockerfile: (немного сложнее, но похоже на приложение для входа в систему)

### STAGE 1: Build the AngularJS app ###

FROM node:lts-alpine as build-stage

RUN apk --no-cache add git

WORKDIR /app

COPY package.json /app/

RUN npm install

COPY . .

# Production mode build
RUN npm run build:prod


### STAGE 2: Add Nginx for hosting the AngularJS app ###

FROM nginx:stable-alpine as production-stage

# Removes the default nginx html files
RUN rm -rf /usr/share/nginx/html/*

# Copy the bundle
COPY --from=build-stage /app/dist /usr/share/nginx/html

# Copy the default nginx.conf
COPY --from=build-stage /app/nginx.conf /etc/nginx/conf.d/default.conf

VOLUME ["/usr/share/nginx/html/env"]

EXPOSE 80

# Copy .env file and shell script to container
WORKDIR /usr/share/nginx/html
COPY ./scripts/generate_env.sh .
COPY .env .

# Add bash
RUN apk add --no-cache bash

# Make our shell script executable
RUN chmod +x generate_env.sh

# Start Nginx server
CMD ["/bin/bash", "-c", "/usr/share/nginx/html/generate_env.sh && nginx -g \"daemon off;\""]

docker-compose.yml

version: '3'

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.2
    # Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock

  app-login:
    image: app-login
    labels:
      - "traefik.http.routers.app-login.rule=Path(/login)"

  app-contacts:
    image: app-contacts
    labels:
      - "traefik.http.routers.app-contacts.rule==Path(/contacts)"

Не уверен, где я ошибся.

Я искал в Google и где-то вижу, что люди используют https://www.getambassador.io/ с этим стеком, но я не Я тоже не знаю, как его настроить.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я обнаружил проблему

На основе этой ссылки https://docs.traefik.io/routing/routers/#rule

Backticks or Quotes?
To set the value of a rule, use backticks ` or escaped double-quotes \".

Single quotes ' are not accepted as values are Golang's String Literals.

Таким образом, правило должно быть

"traefik.http.routers.app-contacts.rule==Path(`/contacts`)"
0 голосов
/ 06 августа 2020

По умолчанию Traefik прослушивает порт 80. Вы должны заменить «81:81» на «81:80». В вашем веб-браузере вы должны использовать порт 81, он будет сопоставлен с 80 в контейнере Traefik.

EDIT:

В ваших ярлыках есть несколько синтаксических ошибок.

  • == вместо = в последней строке
  • Пути должны быть заключены в кавычки с ``

Если вы проверите панель Traefik Dashboard (http://localhost: 8080 /), вы увидите статус маршрутизатора и ошибки конфигурации.

С вашей текущей конфигурацией, NGINX должен принимать запросы на путь / логин и / контакты, а не по умолчанию /. Вы можете использовать метки ниже, две дополнительные строки полезны, если вы хотите удалить часть пути (логин или контакты) перед перенаправлением на NGINX, чтобы вы NGINX слушали по умолчанию /.

  app-login:
    image: app-login
    labels:
      - "traefik.http.routers.app-login.rule=PathPrefix(`/login`)"
      - "traefik.http.routers.app-login.middlewares=app-login-stripprefix"
      - "traefik.http.middlewares.app-login-stripprefix.stripprefix.prefixes=/login"

  app-contacts:
    image: app-contacts
    labels:
      - "traefik.http.routers.app-contacts.rule=PathPrefix(`/contacts`)"
      - "traefik.http.routers.app-contacts.middlewares=app-contacts-stripprefix"
      - "traefik.http.middlewares.app-contacts-stripprefix.stripprefix.prefixes=/contacts"
...