「Dockerコンテナを複数動かしていて、ルーティングが面倒…」
「SSL証明書の管理を自動化したい!」
現代のマイクロサービスやコンテナ環境では、Traefik(トラフィック)という革新的なリバースプロキシが注目を集めています。
従来のNginxやApacheと違い、Traefikは動的な設定変更や自動SSL証明書取得など、コンテナ時代に最適化された機能を持っているんです。設定ファイルをほとんど書かずに、ラベルやアノテーションだけでルーティングを設定できる手軽さが魅力になります。
この記事では、Traefikの基礎から実践的な使い方まで、初心者の方にも分かりやすく解説していきます!
Traefikとは?基本を理解しよう
一言で説明すると
Traefikは、コンテナ環境に特化した、動的設定が可能な現代的なリバースプロキシ・ロードバランサーです。
Go言語で開発されており、軽量で高速、そしてクラウドネイティブなアプリケーションに最適な設計になっています。
従来のリバースプロキシとの違い
Nginx や Apache の場合:
# 設定ファイルを手動で編集
server {
server_name app1.example.com;
location / {
proxy_pass http://backend1:8080;
}
}
# 新しいサービスを追加するたびに編集&リロード
Traefik の場合:
# Dockerのラベルで設定(自動認識)
labels:
- "traefik.http.routers.app1.rule=Host(`app1.example.com`)"
サービスが起動すると、Traefikが自動的に認識してルーティングを設定してくれるんです!
Traefikの主な特徴
1. 動的設定(Auto Service Discovery)
最大の特徴は、サービスディスカバリー機能です。
対応プラットフォーム:
- Docker / Docker Swarm
- Kubernetes
- Consul
- Etcd
- Rancher
- ECS(Amazon)
これらの環境で起動したサービスを、自動的に検出してルーティングを設定します。
2. 自動SSL/TLS証明書取得
Let’s Encrypt と統合されており、SSL証明書を自動で取得・更新してくれます。
# たった1行の設定で自動HTTPS化
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
証明書の更新を忘れて期限切れ…という心配がなくなります。
3. 豊富なミドルウェア
リクエスト処理をカスタマイズできる、様々なミドルウェアが用意されています。
主なミドルウェア:
- 認証(Basic認証、OAuth、ForwardAuthなど)
- レート制限
- リダイレクト(HTTPからHTTPSなど)
- ヘッダー追加・変更
- CORS対応
- 圧縮
- IPホワイトリスト
4. 負荷分散
複数のバックエンドサーバーに、トラフィックを分散できます。
対応アルゴリズム:
- ラウンドロビン
- 重み付けラウンドロビン
- IPハッシュ
5. リアルタイムダッシュボード
Webベースの管理画面で、現在のルーティング状況を視覚的に確認できます。
Traefikの基本構成要素
エントリポイント(EntryPoints)
外部からの接続を受け付ける「入口」です。
例:
entryPoints:
web:
address: ":80" # HTTP用
websecure:
address: ":443" # HTTPS用
ssh:
address: ":22" # SSH用
ルーター(Routers)
リクエストをどのサービスに振り分けるか決定するルールです。
ルール例:
- Host: ドメイン名による振り分け
- Path: URLパスによる振り分け
- Headers: HTTPヘッダーによる振り分け
# app1.example.com へのアクセスは service1 へ
routers:
app1:
rule: "Host(`app1.example.com`)"
service: service1
サービス(Services)
実際のバックエンドサーバー(コンテナ)への接続設定です。
services:
service1:
loadBalancer:
servers:
- url: "http://backend1:8080"
- url: "http://backend2:8080"
ミドルウェア(Middlewares)
リクエストやレスポンスを処理する中間層です。
middlewares:
auth:
basicAuth:
users:
- "user:$apr1$H6uskkkW$..."
Docker環境でのTraefik導入
基本的なDocker Composeの設定
最もシンプルな構成から始めましょう。
docker-compose.yml:
version: '3'
services:
traefik:
image: traefik:v2.10
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080" # ダッシュボード
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
- "traefik.http.routers.whoami.entrypoints=web"
起動:
docker-compose up -d
アクセス:
- http://whoami.localhost → whoamiコンテナにアクセス
- http://localhost:8080 → Traefikダッシュボード
複数サービスのルーティング
version: '3'
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
app1:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.app1.rule=Host(`app1.localhost`)"
app2:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.app2.rule=Host(`app2.localhost`)"
app3:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.app3.rule=PathPrefix(`/api`)"
アクセス:
- http://app1.localhost → app1へ
- http://app2.localhost → app2へ
- http://localhost/api → app3へ
Let’s Encryptでの自動SSL化
本番環境で最も重要な設定です。
設定ファイル(traefik.yml)
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
Docker Composeでの実装
version: '3'
services:
traefik:
image: traefik:v2.10
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./traefik.yml:/traefik.yml:ro"
- "./letsencrypt:/letsencrypt"
myapp:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`example.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
重要:
acme.json
のパーミッションは 600 にする必要があります- HTTPチャレンジには80番ポートが必要です
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json
ミドルウェアの活用
Basic認証の追加
services:
traefik:
# ... (省略)
admin-panel:
image: myapp/admin:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.admin.rule=Host(`admin.example.com`)"
- "traefik.http.routers.admin.middlewares=admin-auth"
- "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$H6uskkkW$$..."
パスワードの生成:
# htpasswdコマンドを使用
htpasswd -nb admin secretpassword
# または、オンラインツールを使用
# https://hostingcanada.org/htpasswd-generator/
HTTPからHTTPSへのリダイレクト
labels:
- "traefik.http.routers.myapp-http.rule=Host(`example.com`)"
- "traefik.http.routers.myapp-http.entrypoints=web"
- "traefik.http.routers.myapp-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
レート制限
DDoS対策として、アクセス制限を設定できます。
labels:
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
- "traefik.http.routers.myapp.middlewares=rate-limit"
CORS設定
labels:
- "traefik.http.middlewares.cors.headers.accesscontrolallowmethods=GET,OPTIONS,PUT,POST,DELETE"
- "traefik.http.middlewares.cors.headers.accesscontrolalloworigin=*"
- "traefik.http.middlewares.cors.headers.accesscontrolmaxage=100"
- "traefik.http.middlewares.cors.headers.addvaryheader=true"
IPホワイトリスト
特定のIPアドレスからのみアクセスを許可します。
labels:
- "traefik.http.middlewares.ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8"
- "traefik.http.routers.internal.middlewares=ip-whitelist"
Kubernetes環境でのTraefik
Helmでのインストール
Kubernetesでは、Helmチャートを使って簡単にインストールできます。
# Helmリポジトリの追加
helm repo add traefik https://traefik.github.io/charts
helm repo update
# Traefikのインストール
helm install traefik traefik/traefik
Ingressリソースの作成
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
tls:
- secretName: myapp-tls
hosts:
- myapp.example.com
IngressRouteの利用(Traefik独自)
より高度な設定が可能な、Traefik専用のリソースです。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: myapp-ingressroute
spec:
entryPoints:
- websecure
routes:
- match: Host(`myapp.example.com`)
kind: Rule
services:
- name: myapp-service
port: 80
middlewares:
- name: auth-middleware
tls:
certResolver: letsencrypt
ミドルウェアの定義
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: auth-middleware
spec:
basicAuth:
secret: auth-secret
負荷分散の設定
ラウンドロビン(デフォルト)
複数のコンテナに均等に振り分けます。
services:
app:
image: myapp:latest
deploy:
replicas: 3
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`example.com`)"
- "traefik.http.services.app.loadbalancer.server.port=8080"
Docker Swarmやレプリカを使うと、自動的に負荷分散されます。
重み付けロードバランシング
services:
app:
labels:
- "traefik.http.services.app.loadbalancer.server.port=8080"
- "traefik.http.services.app.loadbalancer.servers.0.url=http://backend1:8080"
- "traefik.http.services.app.loadbalancer.servers.0.weight=3"
- "traefik.http.services.app.loadbalancer.servers.1.url=http://backend2:8080"
- "traefik.http.services.app.loadbalancer.servers.1.weight=1"
backend1が3/4、backend2が1/4のトラフィックを受け取ります。
ヘルスチェック
バックエンドの健全性を監視します。
labels:
- "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.app.loadbalancer.healthcheck.interval=10s"
- "traefik.http.services.app.loadbalancer.healthcheck.timeout=3s"
実践的な使用例
例1:WordPress + MariaDB
version: '3'
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
wordpress:
image: wordpress:latest
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: secret
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host(`blog.example.com`)"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"
db:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
例2:マイクロサービス構成
version: '3'
services:
traefik:
image: traefik:v2.10
# ... (省略)
frontend:
image: myapp/frontend:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`app.example.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
api:
image: myapp/api:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.routers.api.middlewares=api-stripprefix"
- "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api"
admin:
image: myapp/admin:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.admin.rule=Host(`admin.example.com`)"
- "traefik.http.routers.admin.entrypoints=websecure"
- "traefik.http.routers.admin.tls.certresolver=letsencrypt"
- "traefik.http.routers.admin.middlewares=admin-auth"
- "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$..."
Traefikのメリット
1. 設定が簡単
ラベルやアノテーションだけで、ほとんどの設定ができます。従来のような複雑な設定ファイルは不要です。
2. 自動化が充実
サービスの起動・停止を自動認識し、ルーティングを動的に更新してくれます。
3. 最新技術への対応
Docker、Kubernetes、gRPC、WebSocketなど、現代的な技術スタックに標準対応しています。
4. Let’s Encrypt統合
SSL証明書の取得・更新が完全自動化され、管理の手間がかかりません。
5. 軽量で高速
Go言語で書かれており、メモリ使用量が少なく、パフォーマンスが優れています。
Traefikのデメリット
1. 学習曲線
独自の概念(エントリポイント、ルーター、サービスなど)があり、最初は理解に時間がかかります。
2. ドキュメントの分散
v1からv2への大きな変更があり、古い情報と新しい情報が混在しています。
3. 静的ファイル配信には不向き
Nginxのような静的ファイルの高速配信には最適化されていません。あくまでリバースプロキシとして使うべきです。
4. 複雑な設定は難しい
非常に高度なカスタマイズをする場合、Nginxの方が柔軟性があることもあります。
よくある質問
Q1. TraefikとNginx、どちらを選ぶべき?
Traefikが向いている:
- Docker/Kubernetesを使っている
- マイクロサービスアーキテクチャ
- 動的な環境変更が多い
- SSL証明書の自動管理が欲しい
Nginxが向いている:
- 静的ファイルの配信がメイン
- 従来型のサーバー構成
- 細かいチューニングが必要
- 枯れた技術を使いたい
Q2. 本番環境で使えますか?
はい、多くの企業で本番運用されています。
GitLab、Cloudflare、Red Hatなど、大手企業でも採用実績があります。
Q3. パフォーマンスはどうですか?
Nginxと比較して、リバースプロキシとしての性能は同等レベルです。
ただし、静的ファイル配信の速度ではNginxの方が優れています。
Q4. バージョン1と2の違いは?
バージョン2で設計が大幅に変更されました。
現在はv2が推奨されており、v1は既に非推奨です。これから学ぶなら、必ずv2を選びましょう。
Q5. ダッシュボードのセキュリティは?
デフォルトでは認証なしでアクセスできてしまいます。
本番環境では、必ずBasic認証やIPホワイトリストを設定しましょう。
command:
- "--api.dashboard=true"
labels:
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:..."
まとめ:Traefikで現代的なインフラを構築しよう
Traefikについて、基礎から実践まで解説してきました。
重要ポイントのおさらい:
- 動的設定が最大の特徴
サービスの自動検出で、手動設定が不要に - Let’s Encrypt統合で自動HTTPS化
SSL証明書の管理が完全自動化される - Docker/Kubernetesに最適
コンテナ環境での使用を前提とした設計 - ミドルウェアで柔軟なカスタマイズ
認証、リダイレクト、レート制限など豊富な機能 - 学習コストはあるが、習得すれば強力
独自の概念を理解すれば、非常に便利なツール
Traefikは、マイクロサービスやコンテナ環境でのインフラ構築を大幅に簡素化してくれる強力なツールです。この記事を参考に、ぜひあなたのプロジェクトでも活用してみてくださいね!
コメント