そんな今日この頃の技術ネタ

本家側に書くほどでもない小ネタ用

traefikでサブドメインを振り分ける

先の記事でドメインを手に入れたので、次はサーバでポート違いで運用しているサービスに対してサブドメインを振り分ける。

昔ながらの方法でいうと例えばNginxでserver name項で振り分ける手段もあるが、うちでは基本的にDockerを用いて運用しているので、もっとモダンにそれ用に特化されたtraefikを使ってみることにした。


doc.traefik.io

(とりあえず把握してる範囲では)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
  1. IPアドレス+ポート指定でのアクセスを考慮しないでよければports項は消してしまって良い
  2. labels項にtraefik.enable: trueを記述してtraefikで扱うことを明記
  3. networksとして事前に作成されているtraefik-networkに参加させる
  4. labels項でtraefik.http.routers.sample.rule: Host(sample.<ドメイン>)としてsample.のサブドメインでアクセスできるように定義
  5. labels項でtraefik.http.services.sample.loadbalancer.server.port: 80のようにコンテナ内部でのサービスのポートを指定

これで立ち上げると、上手く行っているとブラウザ上からもhttp://sample.<ドメイン>のアドレスでアクセスができるようになる。

また、traefikのダッシュボードのHTTP RoutersだったりHTTP Servicesに記述が追加されるはずである。