先の記事でドメインを手に入れたので、次はサーバでポート違いで運用しているサービスに対してサブドメインを振り分ける。
昔ながらの方法でいうと例えばNginxでserver name項で振り分ける手段もあるが、うちでは基本的にDockerを用いて運用しているので、もっとモダンにそれ用に特化されたtraefikを使ってみることにした。
(とりあえず把握してる範囲では)traefikのDockerコンテナを立ち上げておくことで、Dockerで新たなサービスを追加を検知してサブドメインで振り分けてくれるようになる感じのものだ。
traefik本体
ディレクトリに内に設定ファイルとしてtraefik.ymlとして以下の設定を加えておく。
entryPoints:
web:
address: :80
api:
insecure: false
dashboard: true
providers:
docker:
exposedByDefault: false
こだわりはないので、ひとまず素のurlを入力した(= 80番ポートでのアクセスになる)際にtraefikのダッシュボードが見れる感じで設定。
また、compose.ymlとして以下の作成。
services:
traefik:
image: traefik:v3.6.5
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
environment:
TZ: Asia/Tokyo
labels:
traefik.enable: true
traefik.http.routers.dashboard.rule: Host(`<取得したドメイン>`)
traefik.http.routers.dashboard.entrypoints: web
traefik.http.routers.dashboard.service: api@internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
networks:
- traefik-network
networks:
traefik-network:
external: true
将来的なsslアクセス対応を考慮して一応80と共に443のポートも解放。
あらかじめ取得したドメインをlabels項の中のtraefik.http.routers.dashboard.rule項に入力し、traefikで扱うネットワークをtraefik-networkとして定義している。

サービスの追加
実際にサービスをtraefik管理下に置くために、それぞれのcompose.ymlについて記述を加えていく。
例えばシンプルにnginxを素で立ち上げたとする。(デフォでは内部ポートが80でhttpアクセスできる。)
これを「sample」という名称のサービスとして扱うとして以下のような形になる。
services:
webapp:
image: nginx:latest
# ports:
# - 8001:80
labels:
traefik.enable: true
traefik.http.routers.sample.rule: Host(`sample.<ドメイン>`)
traefik.http.services.sample.loadbalancer.server.port: 80
networks:
- traefik-network
networks:
traefik-network:
external: true
- IPアドレス+ポート指定でのアクセスを考慮しないでよければports項は消してしまって良い
- labels項にtraefik.enable: trueを記述してtraefikで扱うことを明記
- networksとして事前に作成されているtraefik-networkに参加させる
- labels項でtraefik.http.routers.sample.rule: Host(
sample.<ドメイン>)としてsample.のサブドメインでアクセスできるように定義 - labels項でtraefik.http.services.sample.loadbalancer.server.port: 80のようにコンテナ内部でのサービスのポートを指定
これで立ち上げると、上手く行っているとブラウザ上からもhttp://sample.<ドメイン>のアドレスでアクセスができるようになる。
また、traefikのダッシュボードのHTTP RoutersだったりHTTP Servicesに記述が追加されるはずである。