Как для маршрутизации с Traefik контейнеру Docker (Swarm) нужен порт в контексте URL-адреса хоста, например / myapp? - PullRequest
1 голос
/ 09 апреля 2019

Моя конфигурация - Docker Swarm.

MyWebApp работает в контейнере и имеет доступ к порту 8100.

По некоторым причинам мне нужно, чтобы при доступе по URL-адресу использовался не порт, а контекст URL, например myhost.com/mywebapp.

Маршрутизация должна выполняться Traefik.

Я пытался использовать Path, PathPrefix, PathPrefixStrip, использовал настройку Traefik, в любом случае тот же результат, я могу получить доступ только к MyWebApp, давая порт в URL-адресе, невозможно использовать контекст /mywebapp.

#startscript.sh

docker swarm init
docker network create -d overlay proxy
docker stack deploy -c docker-compose.traefik.yml traefik
docker stack deploy -c docker-compose.webapps.yml webapps

traefik.toml

accessLogsFile = "/dev/stdout"

logLevel = "DEBUG"

defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.http]
  address = ":80"
#    [entryPoints.http.redirect]
#    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
      [[entryPoints.https.tls.certificates]]
      CertFile = "/run/secrets/cert.pem"
      KeyFile = "/run/secrets/key.pem"

[web]
address = ":8085"

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "myhost.com"
watch = true
swarmmode = true
exposedbydefault = false

[file]

докер-Compose-traefik.yml

version: '3.3'

networks:
  proxy:
    external:
      name: proxy

configs:
  traefik_toml_v2:
    file: ./traefik.toml

secrets:
  traefik_cert:
    file: ./tls/cert.pem
  traefik_key:
    file: ./tls/key.pem

services:
  traefik:
    image: traefik
    deploy:
      replicas: 2
      placement:
        constraints:
        - node.role == manager
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    networks:
    - proxy
    ports:
    - target: 80
      protocol: tcp
      published: 80
      mode: ingress
    - target: 443
      protocol: tcp
      published: 443
      mode: ingress
    - target: 8085
      protocol: tcp
      published: 8085
      mode: ingress
    configs:
    - source: traefik_toml_v2
      target: /etc/traefik/traefik.toml
      mode: 444
    secrets:
    - source: traefik_cert
      target: cert.pem
      uid: "0"
      mode: 400
    - source: traefik_key
      target: key.pem
      uid: "0"
      mode: 400

докер-Compose-webapps.yml

version: '3.3'

networks:
  proxy:
    external: true
  net:
    driver: overlay
    attachable: true

services:
  whoami:
    image: emilevauge/whoami
    networks:
    - proxy
    deploy:
      replicas: 2
      resources:
        limits:
          memory: 1G
      labels:
#This is working - i can access with: http://myhost/whoami
      - traefik.frontend.rule=PathPrefixStrip:/whoami
      - traefik.docker.network=proxy
      - traefik.port=80
      - traefik.enable=true

  mywebapp:
    image: myregistry/myrepos:my_image
    networks:
    - proxy
    - net
    ports:
    - 8100:8100
    volumes:
    - ~/dev/myconf:/home/developer/dev/myconf 
    command: mywebapp.bin --http-address=0.0.0.0 --http-port=8100
    deploy:
      replicas: 2
      resources:
        limits:
          memory: 1G
      labels:
      - traefik.enable=true
#This is NOT working - i canNOT access with: http://myhost/webapp
#Access is only possible with: http://myhost:8100
#WHAT I HAVE TO DO THAT i can forward/redirect http://myhost:8100 to http://myhost/webapp????
#      - traefik.frontend.rule=Host:myhost.com;Path:/mywebapp
#      - traefik.port=8100
#I tried both, with servicename and without servicename, in both cases access to http://myhost/webapp is not possible, only to http://myhost:8100
      - traefik.webapps_mywebapp.frontend.rule=Host:myhost.com;Path:/mywebapp
      - traefik.webapps_mywebapp.port=8100
      - traefik.docker.network=proxy

1 Ответ

0 голосов
/ 12 июня 2019

Я собираюсь взять удар на этом.

Для начала вы открыли порты контейнера докера для внешних подключений:

ports:
  - 8100:8100

Вот почему вы можете получить доступ кURL через порт.Таким образом, когда вы получаете доступ к нему через http://url:8100,, вы фактически обходите traefik и подключаетесь к контейнеру напрямую.

Если вы настроите его как EXPOSE, это должно открыться только дляDocker Network.

expose:
  - "8100"

(Ссылка здесь: В чем разница между портами docker-compose и expose )

Теперь перейдем к проблеме соединения с Traefik,одна причина, по которой я не вижу доступа, заключается в том, что у вас неправильное правило внешнего интерфейса:

labels:    
  - traefik.frontend.rule=Host:myhost.com;Path:/mywebapp

Наличие правила Host потребует от вас добавления дополнительной информации в заголовок запроса.Вы не можете просто вызвать URL-адрес в одиночку.

Для Path я не уверен, что это делает, но для меня он просто отправляет 404.

Вам нужно установить PathPrefixStrip какединственное правило внешнего интерфейса:

labels:    
  - traefik.frontend.rule=PathPrefixStrip:/mywebapp

Я столкнулся с той же проблемой.Вот пример фрагмента docker-compose, который работал для меня:

cherrypy-helloworld:
  build:
    dockerfile: cherrypy_helloworld.Dockerfile
  expose:
    - "8080"
  volumes:
    - $PWD/cherrypy_helloworld:/pyapp
  labels:
    - traefik.frontend.rule=PathPrefixStrip:/apitest
    - traefik.enable=true

Надеюсь, это поможет.

...