ググってもなかなかサンプルが見当たらずかなりはまりました。
最終的には以下のページが参考になりました。
Docker + Traefik の基本的な設定は以前の記事をご覧ください。
環境
- Docker 20.10.12
- Traefik v2.7
イメージ図
やりたいことは以下のような感じです。
api1.localhost
へのアクセスはポート3000へapi2.localhost
へのアクセスはポート4000へ
サンプル
簡単な解説をコメントに書いています。
ports:
- 3000:3000
- 4000:4000
labels:
- traefik.enable=true
#------------------------------
# foo という名前のルーターを定義し、
# エントリーポイント http (traefik側で設定した任意の名前) と関連付け
- traefik.http.routers.foo.entrypoints=http
# ルーター foo のホスト名を "api1.localhost" に設定
- traefik.http.routers.foo.rule=Host(`api1.localhost`)
# 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=Host(`api2.localhost`)
- traefik.http.routers.bar.service=bar-service
- traefik.http.services.bar-service.loadbalancer.server.port=4000
ports
でホストのポートとマッピングしていますが、実際には expose
でコンテナ側のポートを開けるだけのほうがよいと思います。