Как управлять несколькими портами, выставленными на порту 80 с помощью докера? - PullRequest
1 голос
/ 21 сентября 2019

У меня есть следующие настройки:

version: '3'

services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    ports:
      - 80:80
    command:
      - --api.debug=true
      - --api.insecure=true
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --providers.docker.exposedByDefault=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.routers.traefik.rule=Host(`monitor.domain.org`)
      - traefik.http.routers.traefik.entrypoints=web
    networks:
      - web
  db:
    image: registry.domain.com/repo/db:latest
    container_name: db
    restart: always
    networks:
      - internal
  api:
    image: registry.domain.com/repo/api:latest
    container_name: api
    ports:
      - 80:3001
    volumes:
      - /root/rsa.pem:/root/certs/rsa.pem
      - /root/rsa_pub.pem:/root/certs/rsa_pub.pem
    restart: always
    depends_on:
      - db
    environment:
      - MAIL_ADDRESS=${MAIL_ADDRESS}
      - MAIL_PASSWORD=${MAIL_PASSWORD}
      - MAIL_HOST=${MAIL_HOST}
    labels:
      - traefik.http.routers.api.rule=Host(`api.domain.org`)
      - traefik.http.routers.api.entrypoints=web
    networks:
      - internal
      - web
  app:
    image: registry.domain.com/repo/app:latest
    container_name: app
    restart: always
    depends_on:
      - api
      - db
    labels:
      - traefik.http.routers.app.rule=Host(`domain.org`,`www.domain.org`)
      - traefik.http.routers.app.entrypoints=web
    networks:
      - web

networks:
  web:
    external: true
  internal:
    external: false

Очевидно, я получаю сообщение об ошибке от Docker, говорящее Bind for 0.0.0.0:80 failed: port is already allocated.Либо предоставление port 80 услуги traefik, либо услуги api отдельно работает отлично.Если я не выставлю port 80 на обоих этих сервисах, он не будет работать для них обоих.Служба app, которая работает на Nginx, работает без предоставления port 80.Как сделать так, чтобы службы api и traefik работали вместе на port 80?

1 Ответ

1 голос
/ 22 сентября 2019

Практически вам нужно сделать для API то же самое, что вы сделали для приложения, выставить его через traefik.

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

Так что вам просто нужно удалить ports: - 80:3001 из вашего API-сервиса.

Что произойдет, так это то, что traefik будет прослушивать только порт 80, и весь трафик, который имеет http-заголовок хоста domain.org или www.domain.org, будет перенаправлен в службу приложения, хотя все запросы с api.domain.org будутбыть направлено на ваш сервис API.

Если вы выполнили все вышеперечисленное и не можете отправлять запросы в службу API, пожалуйста, поделитесь некоторыми журналами из своей службы, чтобы проверить ошибки. В большинстве случаев некоторые заголовки необходимо распространять на внутренние службы, чтобы они моглиработать должным образом.

PS.Вы используете последнюю версию traefik v2.0, где очевидно, что регистрация службы в точке входа достаточна для того, чтобы traefik направлял запросы к этой службе.В предыдущих версиях вы должны были добавить метку traefik.port к сервису, чтобы объявить, где ваш сервис прослушивает, что было немного более явным по отношению к происходящему. документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...