プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/06/16

Docker + Traefik でサブディレクトリによる振り分けを行う

event_note2022/06/15 23:08

ググってもなかなかサンプルが見当たらずかなりはまりました。

最終的には以下のページが参考になりました。

Docker + Traefik の基本的な設定は以前の記事をご覧ください。

環境

  • Docker 20.10.12
  • Traefik v2.7

イメージ図

やりたいことは以下のような感じです。

  • <ホストのURL>/api1/ へのアクセスはポート3000へ
  • <ホストのURL>/api2/ へのアクセスはポート4000へ

サンプル

簡単な解説をコメントに書いています。

ports:
  - 3000:3000
  - 4000:4000
labels:
  - traefik.enable=true
  #------------------------------
  # foo という名前のルーターを定義し、エントリーポイント http と関連付け
  - traefik.http.routers.foo.entrypoints=http
  # リクエストパス /api1 とマッチするよう指定
  - traefik.http.routers.foo.rule=PathPrefix(`/api1{regex:$$|/.*}`)
  # foo-middleware という名前のミドルウェアを定義し、ルーター foo と関連付け
  - traefik.http.routers.foo.middlewares=foo-middleware
  # サービスにリクエストを行う前にリクエストパスの先頭の /api1 を取り除くように指定
  - traefik.http.middlewares.foo-middleware.stripprefix.prefixes=/api1
  # foo-service という名前のサービスを定義し、ルーター foo と関連付け
  - traefik.http.routers.foo.service=foo-service
  # foo-service へのアクセスをポート3000 へ飛ばす
  - traefik.http.services.foo-service.loadbalancer.server.port=3000
  #------------------------------
  - traefik.http.routers.bar.entrypoints=http
  - traefik.http.routers.bar.rule=PathPrefix(`/api2{regex:$$|/.*}`)
  - traefik.http.routers.bar.middlewares=bar-middleware
  - traefik.http.middlewares.bar-middleware.stripprefix.prefixes=/api2
  - traefik.http.routers.bar.service=bar-service
  - traefik.http.services.bar-service.loadbalancer.server.port=4000

ports でホストのポートとマッピングしていますが、実際には expose でコンテナ側のポートを開けるだけのほうがよいと思います。