web-dev-qa-db-ja.com

Traefikを使用したルーティングパス

現在、いくつかのDockerコンテナ用にTraefikを使用してロードバランサー/リバースプロキシをセットアップしようとしています。いくつかのプレフィックスパスを使用してアプリを利用できるようにTreafikを構成するのに問題があります。 この例 に基づいて、DockerとDockercomposeを使用して実行されている基本的なTraefik構成を取得できます。問題は、パスで「whoamI」コンテナーに到達できるようにすることはできますが、アプリや他のコンテナーには到達できないことです。

たとえば、whoamIコンテナーを開始するためのdocker-composeファイル(以下を参照)と、5つのPortainerコンテナー(人々がシナリオを再作成できるようにするため)を作成しました。 woamIは/waiで、Portainerは/portainer1で利用できると思います。

代わりに、Portainer(/wai経由)ではなく、whoamI Webサーバー(/portainer1経由)にアクセスできます。ただし、/portainer2でPortainerに連絡できます。これら2つのTraefik構成の唯一の違いは、「Path」の代わりに「PathStrip」を使用することです。ただし、厄介なのは、/portainer2に移動したときにしかホワイトページを取得できないことです。ページタイトルと一部のhtmlのみがロードされます。また、ホストマシンに公開されるPortainerコンテナを起動して、予期される動作を確認しました(通常のPortainerページ)。下の添付画像もご覧ください。

編集:

興味深いことに、私は/portainer4/でPortainerに到達することもできます(ただし、/portainer4ではありません)。同じ白いページになります。 /portainer2//portainer4/に移動する際の違いは、Traefikに追加のログが記録されていることに気付くということです(以下を参照)。 /portainer4/を介してPortainerに移動すると、400ステータスを示す3つの追加行がログに表示されます。調査の結果、これはブラウザが追加のファイル(JavaScriptファイル、ファビコン、スタイルシートなど)を読み込もうとしたことが原因であることがわかりました。したがって、/portainer4/でPortainerにアクセスすると、ブラウザはそれらの余分なファイルをフェッチする必要があることを認識し、そうしようとします(/portainer2に移動する場合は発生しません)。たとえば、/portainer4/ico/favicon.icoに移動して自分でファイルにアクセスしようとすると、400 Bad Requestが表示されます。最後に、/portainer2/ico/favicon.icoに移動すると、404 page not foundが表示されます。

これらの結果に基づいて、私は疑問に思っています:

  • / portainer1ではなく/ portainer2でPortainerにアクセスできないのはなぜですか?
  • / portainer2に移動すると、Portainerページ全体が表示されないのはなぜですか?
  • /portainer2//portainer4/の間でファイル(ファビコンなど)へのアクセスに動作の違いがある理由
  • 400 Bad Requestの実際の意味と、この問題を修正できるかどうか/どのように修正できるか

私は本当に正しい方向へのいくつかのポインタをいただければ幸いです

いくつかのスクリーンショット: Different Treafik paths

docker-compose.yml:

version: '2'

services:   
  traefik:
    container_name: traefik
    image: traefik
    command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml
    labels:
        - "traefik.enable=false"      
  whoami:
    image: emilevauge/whoami
    labels:
      - "traefik.backend=whoami"
      - "traefik.frontend.rule=Path: /wai/"   
  portainer1:
    image: portainer/portainer
    labels:
      - "traefik.backend=portainer1"
      - "traefik.frontend.rule=Path: /portainer1/"   
  portainer2:
    image: portainer/portainer
    labels:
      - "traefik.backend=portainer2"
      - "traefik.frontend.rule=PathStrip: /portainer2/"      
  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    labels:
        - "traefik.enable=false"

/wai/portainer1/<myIP>/portainer2//portainer3/、および/portainer4/にそれぞれアクセスした後に生成される追加のTraefikログ:

time="2017-01-13T14:33:16Z" level=debug msg="Round trip: http://172.19.0.2:80, code: 200, duration: 1.000627ms"
time="2017-01-13T14:33:22Z" level=debug msg="Round trip: http://172.19.0.7:9000, code: 404, duration: 1.006089ms"
time="2017-01-13T14:33:24Z" level=debug msg="Round trip: http://172.19.0.3:9000, code: 200, duration: 1.160158ms"
time="2017-01-13T14:33:26Z" level=debug msg="Round trip: http://172.20.0.5:9000, code: 404, duration: 1.291309ms"
time="2017-01-13T14:33:29Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 200, duration: 2.788462ms"
time="2017-01-13T14:33:29Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 777.073µs"
time="2017-01-13T14:33:30Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 1.780621ms"
time="2017-01-13T14:33:30Z" level=debug msg="Round trip: http://172.20.0.4:9000, code: 400, duration: 1.780341ms"
10
Koningh

今朝、私は解決策を見つけました。このような場合の正しいアプローチは、PathPrefixStripルールを使用することです。ただし、 ここで説明 のように、ルールの最後に/を置くと、セットアップが壊れます。 /ルールの最後にあるPathPrefixStrip: /portainer4/を削除して、動作する構成を作成しました。したがって、このdocker-compose構成は私のために機能しました:

version: '2'

services:
  traefik:
    container_name: traefik2
    image: traefik
    command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
    ports:
      - "80:80"
      - "8081:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml
    labels:
        - "traefik.enable=false"
  portainer:
    image: portainer/portainer
    labels:
      - "traefik.backend=portainer"
      - "traefik.frontend.rule=PathPrefixStrip: /portainer"

<myIP>/portainer/に移動すると、portainerページが表示されます。ただし、<myIP>/portainerに移動すると、前述のようにホワイトページが表示されます。

10
Koningh