Contents
1. 前提条件と環境構築
Traefik をコンテナで動作させるには、Docker エンジン・Compose の適切なバージョンと、外部からアクセス可能なポートが確保されていることが前提です。ここでは、インストール状況の確認方法とファイアウォール設定のポイントを解説します。
1.1 Docker Engine と Compose のインストール・バージョン確認
公式サイトで「最新の安定版」かどうかを確認しながら、以下のコマンドでバージョン情報を取得してください。
|
1 2 3 4 5 6 |
# Docker Engine のバージョン(20.10 以降が目安) docker --version # Docker Compose v2 系のバージョン docker compose version |
- Docker Engine は
20.10以上、できれば公式リポジトリで配布されている最新 LTS を使用します。 - Docker Compose は
v2系が推奨され、マルチプラットフォーム対応や API の安定性が向上しています。
インストール手順は OS に応じて公式ドキュメントを参照してください(Ubuntu → apt, CentOS/RHEL → yum/dnf, macOS → Homebrew など)。
1.2 必要ポートの開放とファイアウォール設定
Traefik が提供する HTTP、HTTPS、ダッシュボードに必要なポートは以下の通りです。各ポートが外部から到達可能かつ内部ネットワークでも通信できるように設定します。
| ポート | 用途 |
|---|---|
| 80 | HTTP(エントリポイント) |
| 443 | HTTPS(TLS エントリポイント) |
| 8080 | API & Dashboard(管理用) |
Linux 環境でのファイアウォール例
ufw と firewalld の代表的な設定方法を示します。必要に応じて内部ネットワークだけに制限してください。
|
1 2 3 4 5 6 7 8 9 10 11 |
# ufw を使用する場合 sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 8080/tcp # 管理用は限定的に # firewalld の場合 sudo firewall-cmd --add-port=80/tcp --permanent sudo firewall-cmd --add-port=443/tcp --permanent sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload |
ポートが閉じていると外部リクエストが届かず、TLS 証明書の自動取得も失敗します。
2. Traefik 公式イメージ取得と static 設定
Traefik の公式 Docker イメージは「そのまま」使用できるように最適化されていますが、実運用ではタグ管理や設定ファイルの永続化が重要です。ここでは安全なイメージ取得手順と、基本的な traefik.yml(static 設定)の構造を示します。
2.1 推奨イメージタグの取得方法
公式リポジトリに公開されている最新の安定タグを確認し、そのタグでイメージをプルします。バージョン番号は将来変わる可能性があるため、CI パイプラインでは「タグ」だけでなく イメージダイジェスト をロックすると再現性が保たれます。
|
1 2 3 |
# 例: 現在の最新安定版 (2026 年時点) docker pull traefik:<latest-stable-tag> |
ポイント:
docker images --digestsで取得したダイジェストをdocker run時に指定すれば、タグが更新されても同一イメージを使用できます。
2.2 基本的な static 設定ファイル(traefik.yml)
以下は最小構成の雛形です。コメントで各項目の役割と推奨設定を簡潔に説明しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# traefik.yml log: level: INFO # 本番は INFO、デバッグ時は DEBUG accessLog: filePath: "/var/log/traefik/access.log" format: json # JSON は分析ツールとの相性が良い entryPoints: web: address: ":80" # HTTP 用エントリポイント websecure: address: ":443" # HTTPS 用エントリポイント http: tls: certResolver: letsencrypt # ACME 設定へのリンク(後述) api: dashboard: true # ダッシュボードを有効化 insecure: false # 本番環境は必ず TLS 経由に限定 providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false # 明示的にラベル付与したコンテナだけ公開 network: traefik-public # 後述の外部ネットワーク名 |
- エントリポイント は HTTP と HTTPS の二つを用意し、HTTPS では
certResolverを指定して ACME に委任します。 - Docker Provider の
exposedByDefault: falseにより、意図しないコンテナが自動で公開されるリスクを排除できます。
このファイルはプロジェクトルートに配置し、Compose でボリュームマウントして利用します。
3. Docker ラベルで実装する動的ルーティングとミドルウェア
Traefik の大きな特徴は、Docker コンテナのラベルだけで router・service・middleware を定義できる点です。ここでは代表的なアプリ(nginx と whoami)を例に、ラベル記述と共通ミドルウェアの作り方を解説します。
3.1 router と service のラベル例(nginx・whoami)
以下は docker-compose.yml の抜粋です。各サービスは traefik-public ネットワークに接続し、必要なラベルでルーティング情報を提供します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
version: "3.9" networks: traefik-public: external: true services: nginx: image: nginx:stable-alpine networks: - traefik-public labels: - "traefik.enable=true" # Router 定義:example.com を HTTPS にリダイレクト - "traefik.http.routers.nginx.rule=Host(`example.com`)" - "traefik.http.routers.nginx.entrypoints=websecure" - "traefik.http.routers.nginx.tls=true" # Service 定義:コンテナ内部のポート 80 を使用 - "traefik.http.services.nginx.loadbalancer.server.port=80" whoami: image: traefik/whoami networks: - traefik-public labels: - "traefik.enable=true" - "traefik.http.routers.whoami.rule=Host(`whoami.local`)" - "traefik.http.routers.whoami.entrypoints=websecure" - "traefik.http.routers.whoami.tls=true" |
- router ラベルは
Host条件とエントリポイント、TLS の有無を指定します。 - service ラベルはコンテナ内部ポートのマッピングのみを記述し、ロードバランサーが自動的に処理します。
3.2 ミドルウェアの定義と適用例
共通で使用したいセキュリティ機能やヘッダー付与はミドルウェアとして切り出すことで、複数 router に再利用できます。以下は HTTP→HTTPS リダイレクト、セキュリティヘッダー、IP ホワイトリストの例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
labels: # 1. HTTP → HTTPS の自動リダイレクト(全体適用) - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" # 2. 標準的なセキュリティヘッダーの追加 - "traefik.http.middlewares.secure-headers.headers.customResponseHeaders.X-Content-Type-Options=nosniff" - "traefik.http.middlewares.secure-headers.headers.customResponseHeaders.Referrer-Policy=no-referrer" # 3. 社内ネットワークのみ許可する IP ホワイトリスト - "traefik.http.middlewares.ip-whitelist.ipallowlist.sourceRange=192.168.0.0/16" # router にミドルウェアを紐付け(カンマ区切りで複数指定) - "traefik.http.routers.nginx.middlewares=redirect-to-https,secure-headers,ip-whitelist" |
- 適用順序 は左から右へ評価されるため、リダイレクト → ヘッダー付与 → IP 制限の流れになります。
- ミドルウェアは「名前」で管理できるので、別サービスでも同様に
middlewares=secure-headersと記述すれば同じ設定が再利用可能です。
4. TLS / ACME 設定とセキュリティベストプラクティス
自動証明書取得は利便性が高い一方で、秘密鍵やメールアドレスの取り扱いに注意が必要です。ここでは Let’s Encrypt の基本設定と、TLS 1.3 限定・最小権限コンテナ実行の手順を示します。
4.1 Let's Encrypt(ACME)の基本設定
traefik.yml に ACME 用 resolver を追加し、永続化ボリュームで acme.json を保護します。
|
1 2 3 4 5 6 7 8 |
certificatesResolvers: letsencrypt: acme: email: "admin@example.com" # 実在するメールアドレスを必ず設定 storage: "/letsencrypt/acme.json" # 永続化ボリュームに保存 httpChallenge: entryPoint: web # HTTP-01 は 80 番ポートが必要 |
Compose 側の永続化と権限付与例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
services: traefik: image: traefik:<latest-stable-tag> command: - "--configFile=/etc/traefik/traefik.yml" ports: - "80:80" - "443:443" - "8080:8080" volumes: - "./traefik.yml:/etc/traefik/traefik.yml:ro" - "letsencrypt-data:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" networks: - traefik-public restart: unless-stopped volumes: letsencrypt-data: |
ポイント:
acme.jsonのファイルモードは600に設定し、コンテナ内部の非特権ユーザーでのみアクセスできるようにします。
4.2 TLS 強化と最小権限コンテナ実行
HTTPS エントリポイントに TLS 1.3 のみ許可し、推奨 CipherSuite を限定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
entryPoints: websecure: address: ":443" http: tls: certResolver: letsencrypt minVersion: VersionTLS13 cipherSuites: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 |
非特権ユーザーで実行する Dockerfile(公式イメージをベース)
|
1 2 3 4 5 6 7 8 |
FROM traefik:<latest-stable-tag> # UID/GID を固定し、root からの脱却 RUN addgroup --gid 1000 traefik && \ adduser --uid 1000 --ingroup traefik --disabled-password --gecos "" traefik USER traefik:traefik |
- 理由:コンテナが root 権限で動作すると、脆弱性が発見された際にホストへの権限昇格リスクがあります。
- ボリュームの所有者も同一 UID/GID に合わせておくと、書き込みエラーを防げます。
5. 動作確認・監視・最新機能への対応
構築が完了したら、基本的な動作テストと継続的なメトリクス収集を行いましょう。さらに、Traefik v3 系で実験的に提供されている HTTP/3 の有効化手順も併せて紹介します。
5.1 デプロイ後の基本的なテスト手順
以下の流れでサービスが正しく公開されているかを確認してください。
- コンテナ起動
bash
docker compose up -d - ダッシュボードへのアクセス(TLS 経由)
ブラウザでhttps://<ホストIP>:8080/dashboard/にアクセスし、router・service が一覧表示されていることを確認。 - 実際のアプリへリクエスト
bash
curl -I https://example.com # nginx のレスポンスが 200 OK か
curl -I https://whoami.local # JSON にコンテナ情報が含まれるか - TLS 証明書の検証
openssl s_client -connect <ホストIP>:443 -servername example.comで取得した証明書が有効期限内か確認。
| 症状 | 主な原因 | 推奨対処 |
|---|---|---|
| 404 Not Found | Host 条件が合致していない |
traefik.http.routers.*.rule を再確認 |
| TLS handshake failure | ACME が証明書取得に失敗 | docker logs <traefik> でエラーログを確認 |
| ダッシュボードが HTTP 表示 | api.insecure: true が残っている |
api.dashboard: true と TLS のみ許可に設定 |
5.2 Prometheus と Grafana によるメトリクス可視化
Traefik は組み込みの Prometheus エンドポイントを提供します。static 設定に以下を追記し、HTTPS 経由で安全に取得できるようにします。
|
1 2 3 4 5 6 7 8 9 |
metrics: prometheus: entryPoint: websecure # TLS 経由でメトリクス取得 buckets: - 0.1 - 0.3 - 1.2 - 5.0 |
Prometheus の scrape_configs 例
|
1 2 3 4 5 6 7 8 |
scrape_configs: - job_name: "traefik" static_configs: - targets: ["traefik:8080"] # API がバインドしているポート scheme: https tls_config: insecure_skip_verify: true # 自己署名証明書の場合のみ有効化 |
Grafana では公式ダッシュボード ID 17305(Traefik v3 Metrics)をインポートすると、リクエスト数・レスポンスタイム・TLS ステータスが一目で把握できます。
5.3 実験的 HTTP/3 の有効化 (Traefik v3)
2026 年版 traefik:<latest-stable-tag> は QUIC と HTTP/3 をオプションで提供しています。実装はエントリポイントに experimental.http3.enabled: true を付与し、UDP ポート 443 を開放します。
|
1 2 3 4 5 6 7 8 9 10 |
entryPoints: websecure: address: ":443" http: tls: certResolver: letsencrypt experimental: http3: enabled: true |
- ファイアウォール:
udp/443の許可が必要です。 - 注意点:クライアント側が HTTP/3 に対応していない場合は自動的に HTTP/2/1.1 へフォールバックしますので、サービスの停止リスクは低減されます。
おわりに
以上で、Docker 上に安全かつスケーラブルな Traefik 環境を構築するための全工程をご紹介しました。
前提条件の確認 → イメージ取得 & static 設定 → ラベル駆動の動的ルーティング → TLS/ACME の堅牢化 → テスト・監視 → 新機能(HTTP/3)活用 という流れで進めれば、設定ミスやセキュリティ上の抜け穴を最小限に抑えられます。
本稿の手順は 「公式ドキュメントとバージョンタグの最新情報」 を都度確認しながら適用してください。定期的なイメージ更新と証明書ローテーション、そしてメトリクスに基づくパフォーマンスチューニングを組み合わせることで、長期間安定したリバースプロキシ運用が実現できます。
ぜひ本ガイドをベースに、自社環境や個人プロジェクトで Traefik を活用してみてください。