ググってもなかなかサンプルが見当たらずかなりはまりました。
最終的には以下のページが参考になりました。
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
でコンテナ側のポートを開けるだけのほうがよいと思います。