Служба Docker Swarm Nginx за Traefik выдает ошибку 502 - PullRequest
0 голосов
/ 25 июня 2019

У меня есть док-рой, настроенный на использование Traefik в качестве обратного прокси. Один из контейнеров моего роя работает на сервере Nginx, но я получаю ошибку 502 Bad Gateway при переходе к этой конкретной конечной точке. Трафик настроен следующим образом:

version: '3.5'
services:
  traefik:
    image: traefik:alpine
    command: |-
      --entryPoints="Name:http Address::80 Redirect.EntryPoint:https"
      --entryPoints="Name:https Address::443 TLS"
      --defaultentrypoints="http,https"
      --accesslogsfile="/var/log/access.log"
      --acme 
      --acme.acmelogging="true"
      --acme.domains="${SERVER},${SANS1}"
      --acme.email="${ACME_EMAIL}"
      --acme.entrypoint="https"
      --acme.httpchallenge
      --acme.httpchallenge.entrypoint="http"
      --acme.storage="/opt/traefik/acme.json"
      --acme.onhostrule="true"
      --docker
      --docker.swarmmode
      --docker.domain="${SERVER}"
      --docker.network="frontend"
      --docker.watch
      --api
    networks:
      - frontend
    ports: 
      - target: 80
        published: 80
        mode: host
      - target: 443
        published: 443
        mode: host
      - target: 8080
        published: 8080
        mode: host
    volumes:
      - traefik_acme:/opt/traefik
      - traefik_logs:/var/log/access.log
      - /var/run/docker.sock:/var/run/docker.sock:ro
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
networks:
  frontend:
    name: "frontend"
    driver: overlay
volumes:
  traefik_acme:
  traefik_logs:

Этот составной файл предоставляет сеть overlay и службу Traefik. Остальная часть моего роя определена в следующем файле:

version: "3.5"
services:
  test:
    image: emilevauge/whoami
    deploy:
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER};PathPrefixStrip:/test"
        traefik.port: 80
    networks:
      - frontend
  octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 3000
    networks:
      - frontend
    ports:
      - "3000:80"
  octserver:
    image: ${DOCKER_OCTSERVER_IMAGE_TAG}    
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER};PathPrefixStrip:/api"
        traefik.port: 4000
    networks:
      - frontend
    ports:
      - "4000:4000" 
  visualizer:
    image: dockersamples/visualizer:stable
    deploy:
      placement:
        constraints:
          - 'node.role == manager'
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER};PathPrefixStrip:/visualizer"
        traefik.port: 8001
    networks:
      - frontend
    ports: 
      - "8001:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
  frontend:
    external: true

Соответствующая конфигурация для услуги octeditor:

  octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 3000
    networks:
      - frontend
    ports:
      - "3000:80"

Я сопоставляю порт 80 (который Nginx слушает по умолчанию) с портом 3000, где Traefik настроен для поиска этой службы. Это Dockerfile для службы, выполняющей Nginx:

FROM node:latest as builder

WORKDIR /usr/src/app

COPY package.json . 

RUN npm install

COPY . .

RUN npm run build

FROM nginx

COPY --from=builder /usr/src/app/build /usr/share/nginx/html

Я просто собираю react app и копирую папку сборки в папку /usr/share/nginx/html. Я попытался собрать и запустить этот Dockerfile как отдельный контейнер, и он работает, также я проверил содержимое папки html и все выглядит правильно. Другие службы, кроме службы visualizer, работают правильно. Только эта octedtior служба и visualizer служба дают мне 502 ошибки. Кто-нибудь может предложить решение или даже как проверить трафик, отправляемый в контейнер nginx? Я пробовал docker ps servicename, но я не вижу никаких ошибок от службы.

Edit:

Если я изменю конфигурацию octeditor на эту:

  octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 80
    networks:
      - frontend
    ports:
      - "80:80"

И удалите службу test, которая ранее прослушивала порт 80, похоже, он работает. Я не понимаю, что случилось с предыдущей конфигурацией, однако? Я думал, что раньше отображал трафик с порта 3000 на порт 80 контейнера, тогда как сейчас я отображаю с порта 80 на 80, но ничего не должно было измениться с точки зрения контейнера, верно?

1 Ответ

1 голос
/ 25 июня 2019

Соответствующая конфигурация для службы octeditor:

octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 3000
    networks:
      - frontend
    ports:
      - "3000:80"

Я подключаю порт 80 (который Nginx прослушивает по умолчанию) к порту 3000, где Traefik настроен для поиска этой службы.

Порт traefik должен быть 80, а не 3000. Сопоставление портов создаст переадресацию с хоста на 3000 на контейнер на 80. Однако traefik напрямую связывается с контейнером через общую сеть (frontend) и вам нужно предоставить ему порт контейнера.

Нет необходимости публиковать порт хоста для сервисов, доступ к которым осуществляется через traefik или любой другой обратный прокси, если вам не нужен прямой доступ к ним без прокси (что ставит под вопрос, нужен ли вам обратный прокси в этих сценариях).Другими словами, это можно записать без портов:

  octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 80
    networks:
      - frontend
...