У меня есть док-рой, настроенный на использование 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, но ничего не должно было измениться с точки зрения контейнера, верно?