Contents
Traefik v3によるDocker環境構築の概要
Traefikは2024年現在、Dockerと密接に連携する動的リバースプロキシツールとして注目されています。特にv3では、自動ルーティングやHTTPS証明書の取得がさらに簡素化され、アプリケーションのスケーラビリティ向上に貢献しています。本記事では、Docker ComposeでTraefikを構築し、アプリケーションデプロイまでの一連の手順を解説します。「Traefik Docker デプロイ 手順」というキーワードに沿い、実務でも即活用可能な知識をお伝えします。
Docker Composeファイルの作成手順
Docker ComposeでTraefikサービスを定義する際は、YAMLファイルの構造とパラメータの精度が重要です。以下に必要な設定項目を整理しました。
Traefikサービスの定義
Traefikサービスの最小限の設定例を示します。imageフィールドには公式イメージを使用し、portsでHTTP/HTTPSポートを開放します。
| パラメータ | 値 | 補足 |
|---|---|---|
| image | traefik:latest |
公式イメージの最新版 |
| ports | "80:80", "443:443" |
HTTP/HTTPSポート公開 |
| volumes | ./traefik.yml:/etc/traefik/traefik.yml |
設定ファイルのマウント |
blockquote
Traefikの動作には、traefik.ymlという静的設定ファイルが必要です。このファイルではネットワークやACME(Let's Encrypt)の設定を指定します。
ネットワークとボリューム設定
TraefikはDockerネットワークに参加するため、サービスごとに専用ネットワークを作成するのがベストプラクティスです。また、証明書や設定ファイルを永続化するにはボリュームのマウントが不可欠です。
-
ネットワーク作成例:
yaml
networks:
traefik_net:
driver: bridge -
ボリュームの指定例:
yaml
volumes:- ./certs:/etc/traefik/certs
- ./acme:/etc/traefik/acme
blockquote
ネットワーク構成が不適切だと、サービス間通信に障害が生じる可能性があります。必ずTraefik専用のネットワークを作成してください。
アプリケーションコンテナとの接続
アプリケーションコンテナはTraefikネットワークに参加する必要があります。以下のように、networksセクションでTraefikネットワークを指定します。
|
1 2 3 4 5 6 |
services: my_app: image: my-app-image networks: - traefik_net |
blockquote
この設定により、アプリケーションコンテナはTraefikに自動的にルーティングされるようになります。詳細なルールは後述のLabelsで指定します。
ルーティング設定とLabelsの活用法
Traefikではサービスごとにラベル(Labels)を付与することで、動的なルーティングが可能です。以下の手順で具体的に設定します。
Traefik Labelsによるルール定義
各アプリケーションコンテナにtraefik.http.routers系のラベルを追加します。以下は基本例です。
|
1 2 3 4 |
labels: - "traefik.http.routers.myapp.rule=Host(`example.com`)" - "traefik.http.routers.myapp.entrypoints=websecure" |
- rule: ルーティング条件(ホスト名、パスなど)
- entrypoints: 使用するエントリポイント(HTTP/HTTPS)
blockquote
ルールの書き方はHost,PathPrefix,Queryなど多様です。複数条件を組み合わせることで高度なルーティングが可能です。
複数アプリケーションへの適応例
以下のように、複数のサービスに個別にラベルを設定することで、それぞれのドメインやパスを指定できます。
|
1 2 3 4 5 6 7 8 |
services: app1: labels: - "traefik.http.routers.app1.rule=Host(`app1.example.com`)" app2: labels: - "traefik.http.routers.app2.rule=Host(`app2.example.com`) && PathPrefix(`/api`)" |
blockquote
この設定により、example.comと/apiにアクセスするリクエストはそれぞれ別のアプリケーションにルーティングされます。
HTTPS証明書の自動取得(Let's Encrypt)
TraefikはACMEプロトコルを使ってLet's Encrypt証明書を自動で取得・更新できます。以下に設定手順を解説します。
ACMEプロトコルの導入手順
traefik.ymlファイルに以下のようにACMEの設定を追加します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
entryPoints: websecure: address: ":443" http: tls: certResolver: myresolver certResolvers: myresolver: acme: email: [メールアドレス削除] storage: /etc/traefik/acme.json dnsChallenge: provider: cloudflare |
- email: 証明書更新時の通知先
- storage: 証明書の保存場所(ボリュームで永続化)
- dnsChallenge: ドメイン所有証明に使用するDNSプロバイダー
blockquote
DNSチャレンジを使用すれば、HTTPチャレンジよりもセキュリティが高まります。CloudflareやRoute53などに対応可能です。
証明書の永続化と更新設定
証明書はボリュームに保存することで再起動時でも失われません。また、Traefikは自動で証明書を更新するため、手動管理が不要です。
|
1 2 3 |
volumes: - ./acme:/etc/traefik/acme |
blockquote
この設定により、証明書の取得・更新履歴もファイルに保存されます。長期的な運用には必須です。
ネットワーク構成最適化とロードバランシング
Traefikはネットワーク構成を最適化することで、トラフィック処理効率が向上します。以下に具体的な設定例を示します。
Traefikネットワークのベストプラクティス
- 専用ネットワークの作成: ホスト名やIPアドレスの競合を防ぐ
- エントリポイントの分離: HTTP/HTTPSのトラフィックを分離しセキュリティ向上
| 設定項目 | 内容 |
|---|---|
| networks | traefik_net(専用ネットワーク) |
| entrypoints | web, websecure(分離構成) |
blockquote
トラフィックを細分化することで、セキュリティとパフォーマンスの両立が可能になります。
セッション管理設定例
Traefikでは、ロードバランシングに伴うセッション維持をstickySessionsで指定できます。以下は設定例です。
|
1 2 3 4 5 6 7 |
http: services: my_app: loadBalancer: stickySession: cookieName: "session_id" |
blockquote
このようにして、ユーザーごとのセッション情報を保持することで、ロードバランシングでも一貫性のある処理が可能です。
Docker Swarm/Kubernetesとの連携方法
TraefikはDocker SwarmやKubernetesにも対応しており、クラスタ環境での運用が可能です。それぞれのプラットフォームでの構成手順を解説します。
SwarmモードでのTraefik展開
Swarmではサービス作成時にトラフィック設定を指定できます。以下のようにラベルを追加すると自動でルーティングされます。
|
1 2 3 4 5 6 7 8 9 |
docker service create \ --name traefik \ --publish 80:80 \ --publish 443:443 \ --constraint 'node.role == manager' \ --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ --mount type=volume,source=my-volume,target=/etc/traefik \ traefik:latest |
blockquote
Swarm環境では、docker-compose.ymlに加えて--constraintや--mountの指定が必要です。
Kubernetes Ingressとの統合
KubernetesにはIngressリソースとTraefikの統合が可能です。以下は設定例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: myapp-ingress spec: entryPoints: - websecure routes: - match: Host(`example.com`) kind: Rule services: - name: my-app-service port: 80 |
blockquote
KubernetesではIngressRouteリソースを作成することで、Traefikにルーティング設定を適用できます。
- Docker Composeファイルの作成で基本構造を整える
- Labels活用で動的ルーティングを実現
- HTTPS証明書取得とネットワーク最適化で安全性を高める
- Swarm/Kubernetesとの連携でスケール可能な環境を作る
記事の要点を以下にまとめます。Traefikの導入は、アプリケーション運用効率を大きく向上させます。本記事のステップを実践して成功・失敗ケースをコメントで共有してください。