コンテナを足すたびにNginxの設定を書き,証明書を取り直す── この手間を自動化するのがTraefikだ.コンテナにラベルを付けるだけで,振り分けもHTTPS化も自動で行われる.

Traefikは「動的リバースプロキシ」と呼ばれる.Dockerと連携し,起動したコンテナを自動検出して公開する.Let’s Encryptの証明書取得・更新まで内蔵しており,コンテナ中心の運用と抜群に相性が良い.

この記事は,VPSでDockerを使い,複数サービスを公開する個人開発者に向けている.Nginxとの違いから,ラベルによる振り分け,自動HTTPS,ダッシュボードまでを実践的に解説する.

読み終えたとき,あなたはコンテナを足すだけで自動的にHTTPS公開される仕組みを構築できるようになっている.

なぜTraefikなのか ― Nginxとの違い

Nginxは強力だが静的な設定が基本だ.サービスを足すたびに設定ファイルを書き,証明書を取り,リロードする.コンテナを頻繁に増減する環境では,この手作業が負担になる.

Traefikは動的だ.Dockerと連携し,起動したコンテナのラベルを読んで自動で振り分けを構成する.設定ファイルの編集もリロードも不要で,コンテナを足せば自動で公開される.

さらにTraefikはLet’s Encryptの証明書取得・更新を内蔵している.Certbotを別途動かす必要がなく,HTTPS化が完全に自動化される.

「コンテナ中心・サービスの増減が多い」環境ではTraefik,「枯れた安定性・細かい制御」を求めるならNginx── という使い分けになる.本記事でTraefikの強みを体感しよう.

Traefikの仕組み ― ラベルで設定する

Traefikの核心は,各サービスコンテナに付けた「ラベル」を読んで,振り分けルールを動的に構成することだ.設定はTraefik本体ではなく,公開したい各コンテナ側に書く.

これにより,「このコンテナをこのドメインで公開する」という宣言を,そのコンテナ自身に持たせる形になる.サービスの定義と公開設定が1箇所にまとまり,見通しが良い.

Traefik本体を立てる ― composeでの基本構成

まずTraefik本体のコンテナを立てる.Dockerソケットを読んでコンテナを検出し,80/443で受けて振り分ける.Let’s Encryptの設定もここで行う.

Traefik本体(compose)

services:
  traefik:
    image: traefik:v3
    restart: always
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.le.acme.email=you@example.com
      - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.le.acme.tlschallenge=true
    ports: ["80:80", "443:443"]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt
volumes:
  letsencrypt:

exposedbydefault=falseが重要だ.これにより明示的にラベルを付けたコンテナだけが公開される(意図しない公開を防ぐ).acmeの設定でLet’s Encryptの自動取得が有効になり,証明書はletsencrypt volumeに保存される(必ず永続化する).

サービスを公開する ― ラベルを付けるだけ

公開したいアプリには,ラベルでドメインとHTTPS設定を宣言する.これだけでTraefikが検出し,証明書を取得し,振り分けを構成する.

アプリ側のラベル

services:
  myapp:
    image: myapp
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=Host(`app.example.com`)
      - traefik.http.routers.myapp.entrypoints=websecure
      - traefik.http.routers.myapp.tls.certresolver=le
      - traefik.http.services.myapp.loadbalancer.server.port=3000

このラベルだけで,app.example.comへのHTTPSアクセスが,コンテナの3000番ポートに振り分けられる.証明書はTraefikが自動取得する.新しいサービスを公開したければ,同様のラベルを付けたコンテナを起動するだけ── 設定ファイルの編集もリロードも不要だ.

HTTP→HTTPSリダイレクトとミドルウェア

Traefikはミドルウェアという仕組みで,リダイレクト・認証・レート制限などを差し込める.まずはHTTP→HTTPSの自動リダイレクトを設定する.

HTTP→HTTPSリダイレクト(全体)

# Traefik本体のcommandに追加
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https

# Basic認証ミドルウェアの例(ラベル)
# - traefik.http.middlewares.auth.basicauth.users=user:$$hashed
# - traefik.http.routers.myapp.middlewares=auth

ミドルウェアは再利用可能な処理の部品だ.Basic認証・IPホワイトリスト・レート制限・ヘッダ付与などを定義し,ルーターに適用できる.管理画面に認証をかける,特定IPだけ許可するといった制御を,ラベルで宣言的に組める.

ダッシュボード ― 状態を可視化する

Traefikにはダッシュボードがあり,現在のルーター・サービス・証明書の状態を可視化できる.ただしこれ自体を無防備に公開してはいけない

ダッシュボードは運用状況の把握に便利だが,内部情報を晒すためBasic認証やIP制限で必ず保護する.本番では「ダッシュボードは無効化」または「強固な認証付きで限定公開」が安全だ.Traefikの設定状況を確認したいときに有効化し,普段は閉じておく運用が無難だ.

TraefikとNginxの使い分け

TraefikとNginxは競合ではなく,適材適所だ.それぞれの強みを理解して選ぶ.

観点TraefikNginx
設定方式動的(ラベル自動検出)静的(設定ファイル)
HTTPS自動化内蔵(ACME)Certbot併用
コンテナ増減への追従◎ 自動△ 手動
細かい制御・枯れた安定性
静的配信の性能

コンテナを頻繁に増減し,HTTPS化の手間を無くしたいならTraefik細かい制御・高速な静的配信・枯れた安定性を重視するならNginx.両者を併用する(Traefikで振り分け,背後でNginxが静的配信)構成もある.自分の運用スタイルに合う方を選ぼう.

補論:自動HTTPS化は「コンソール復旧できるVPS」で安心して試せる

Traefikは強力だが,ラベルやACMEの設定をミスすると全サービスが公開されない/証明書が取れない事態にもなる.自動化されているぶん,挙動を理解するまでは試行錯誤が要る.戻せる環境での検証が安心だ.

高速NVMe・50種類以上のOSテンプレートに対応した国内VPS─シン・VPS─ はスナップショットとコンソールを備え,NVMe SSDでコンテナの起動も軽快なため,Traefikの設定を試しては戻す検証がしやすい.固定IPがあるのでLet’s EncryptのTLSチャレンジも安定し,自動HTTPS化を確実に動かせる.

Traefikで複数サービスを公開するなら,独自ドメインとサブドメインが要だ.取り扱い400種類以上のドメイン取得サービス─ムームードメイン─ で取得したドメインにワイルドカードを設定すれば,app. / api. / blog. をコンテナのラベルだけで次々公開できる.

よくある質問(FAQ)

Q1.TraefikとNginxどちらを使うべき?

コンテナを頻繁に増減し,HTTPS化を自動化したいならTraefik.細かい制御・高速静的配信・枯れた安定性ならNginx.コンテナ中心の個人開発ではTraefikの自動化の恩恵が大きい.

Q2.証明書の取得が自動とは?

TraefikはLet’s EncryptのACMEを内蔵し,ラベルで指定したドメインの証明書を自動取得・自動更新する.Certbotを別途動かす必要がない.証明書は永続volumeに保存する.

Q3.意図しないコンテナが公開されないか?

exposedbydefault=falseを設定すれば,明示的にtraefik.enable=trueラベルを付けたコンテナだけが公開される.これでうっかり公開を防げる.

Q4.ダッシュボードは公開してよい?

無防備な公開はNGだ.内部情報を晒すため,Basic認証やIP制限で保護するか,本番では無効化する.必要なときだけ認証付きで限定公開する.

Q5.Let’s EncryptのTLSチャレンジが失敗する

80/443ポートが開いていてドメインがVPSのIPに向いているかを確認する.固定IPのVPSでDNSが正しく設定されていれば安定する.volumeのacme.jsonの権限にも注意.

Q6.既存のNginx構成から移行できる?

可能だが急ぐ必要はない.新規のコンテナサービスからTraefikで公開し始め,徐々に移すのが現実的だ.両者を併用する構成も取れる.

まとめ ― 「コンテナを足すだけで公開」を実現する

Traefikは,ラベルによる動的な振り分けとLet’s Encryptの自動化で,「コンテナを足すだけでHTTPS公開される」運用を実現する.コンテナ中心の個人開発と抜群に相性が良い.

今日やるべきことは,Traefik本体を立て,1つのアプリにラベルを付けて自動HTTPS公開を体験すること.設定ファイルもCertbotも要らずに公開できる手軽さを実感できる.

自動化は運用の手間を劇的に減らす.コンソールとスナップショットで守られたVPSがあれば,Traefikの自動化を安心して取り入れられる.