Docker Swarm Nginx服务在Traefik后面出现502错误

Docker Swarm Nginx服务在Traefik后面出现502错误,docker,nginx,traefik,Docker,Nginx,Traefik,我有一个docker swarm配置为使用Traefik作为反向代理。我的swarm中的一个容器正在运行Nginx服务器,但当我导航到该特定端点时,我收到了一个502坏网关错误。Traefik的设置如下所示: version: '3.5' services: traefik: image: traefik:alpine command: |- --entryPoints="Name:http Address::80 Redirect.EntryPoint:http

我有一个docker swarm配置为使用Traefik作为反向代理。我的swarm中的一个容器正在运行Nginx服务器,但当我导航到该特定端点时,我收到了一个502坏网关错误。Traefik的设置如下所示:

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:
此合成文件提供覆盖网络和Traefik服务。我的swarm的其余部分在以下组合文件中定义:

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"
我正在将Nginx默认侦听的端口80映射到端口3000,Traefik在端口3000中配置为查找此服务。这是运行Nginx的服务的Dockerfile:

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应用程序,并将构建文件夹复制到/usr/share/nginx/html文件夹中。我试着把这个Dockerfile作为一个独立的容器来构建和运行,它可以正常工作,我还检查了html文件夹的内容,一切看起来都是正确的。除visualizer服务外,其他服务都在正确运行。只有这个octedtior服务和visualizer服务给了我502个错误。有人能提出解决方案,甚至如何检查发送到nginx容器的流量吗?我已尝试docker ps servicename,但看不到来自该服务的任何错误

编辑:

如果我将octeditor的配置更改为:

并删除以前在端口80上侦听的测试服务,它似乎可以工作。但是,我不明白以前的配置有什么问题?我以前以为我是在将流量从集装箱的3000端口映射到80端口,而现在我是在将流量从80端口映射到80端口,但是从集装箱的角度来看,什么都不应该改变,对吗

相关配置适用于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"
我正在将Nginx默认侦听的端口80映射到端口3000 其中Traefik配置为定位此服务

traefik端口需要为80,而不是3000。端口映射将创建从3000上的主机到80上的容器的转发。但是,traefik通过共享网络前端直接与容器通信,您需要为其提供容器端口

无需为通过traefik或任何其他反向代理访问的服务发布主机端口,除非您需要在不使用代理的情况下直接访问这些服务,这会使您在这些场景中是否需要反向代理产生疑问。换句话说,这可以在没有端口的情况下写入:

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

谢谢这解决了问题。我不明白-ports选项实际上在做什么。
  octeditor:
    image: ${DOCKER_OCTEDITOR_IMAGE_TAG}
    deploy:
      replicas: 1
      labels:
        traefik.enable: "true"
        traefik.frontend.rule: "Host:${SERVER}"
        traefik.port: 80
    networks:
      - frontend