Contents
TraefikとDocker Composeによるローカル環境のプロキシ構成入門
ローカル開発環境でマイクロサービスを扱う際、複数のコンテナ間での通信や外部アクセス設定は手間がかかる課題です。TraefikはDockerと連携して自動的にルーティングを行うリバースプロキシであり、この記事ではTraefik Docker Compose 設定例を基に、ローカル環境でのマイクロサービスプロキシ構成の具体的手順を解説します。
ローカル開発環境でのマイクロサービスプロキシの意義
マイクロサービスアーキテクチャでは、複数のサービスが独立して動作し、それぞれに独自のポートを使用するため、ローカル環境でテストする際にはポート衝突やリバースプロキシ設定が必須です。TraefikはDockerのラベルを活用することで、手動でNginxなどの設定を書く必要なく自動的にプロキシを構築できる点が大きなメリットです。
記事で使用する技術スタック概要
本記事では以下の技術スタックを前提に解説します:
- Docker Compose:複数のコンテナを一括管理
- Traefik v2.10+:リバースプロキシとしての役割
- Let's Encrypt:HTTPS証明書自動取得
docker-compose.ymlファイルの基本構造とTraefikコンテナの定義
docker-compose.ymlはDocker環境を構築するための設定ファイルであり、サービス・ネットワーク・ボリュームなどの定義が含まれます。Traefikコンテナもこのファイルに記述することで、ローカル開発環境で即座に利用可能です。
サービス定義のベースとなるYAML構文
docker-compose.ymlはYAML形式で書かれており、以下のセクションが基本構造です:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: '3.8' services: traefik: image: traefik:v2.10 ports: - "80:80" - "443:443" volumes: - ./traefik.yml:/etc/traefik/traefik.yml - /var/run/docker.sock:/var/run/docker.sock networks: - traefik-net app-service-1: image: your-app-image labels: - "traefik.http.routers.app.rule=Host(`app1.example.com`)" networks: - traefik-net |
上記の例では、Traefikコンテナがtraefik.ymlで定義された設定を読み込み、マイクロサービス(app-service-1)に対してルーティング規則を適用しています。
ネットワーク・ボリューム設定の重要性
TraefikはDockerネットワークを通じてコンテナと通信するため、専用ネットワーク(traefik-net)を作成し、全てのサービスが同じネットワークに接続する必要があります。また、証明書を永続化するために、/var/run/docker.sockやボリュームを適切にマウントすることも重要です。
Traefikコンテナのポートマッピング設定
TraefikはHTTPとHTTPSの両方を扱えるため、ホストマシンへの公開と内部通信のポート設定を明確にする必要があります。
HTTP/HTTPSポートのホストマシンへの公開
ローカル環境でTraefikを使用する際は、以下のようにポートを公開します:
|
1 2 3 4 |
ports: - "80:80" # HTTPアクセス用(外部からアクセス可能) - "443:443" # HTTPSアクセス用(Let's Encrypt証明書が必要) |
この設定で、ブラウザなどからhttp://localhostやhttps://localhostでTraefikにアクセスできます。
コンテナ間通信のための内部ポート設定
サービスごとに別のポートを使用する場合、Traefikはコンテナ内部のポート(例: 8080)と結びつける必要があります。これはラベルで指定します:
|
1 2 3 |
labels: - "traefik.http.services.app-service-1.loadbalancer.server.port=8080" |
この設定により、Traefikはapp-service-1コンテナにリクエストをlocalhost:8080にルーティングします。
サービスごとのラベルによるルーティング設定とdefaultRuleの活用
Traefikでは、各サービスに対してラベル(label)でルーティング規則を指定できます。また、defaultRuleオプションを使うことで、明示的なルールを省略することが可能です。
個別サービスへのルール定義方法
以下はapp-service-1に対して独自のルールを設定する例です:
|
1 2 3 4 |
labels: - "traefik.http.routers.app.rule=Host(`app1.example.com`)" - "traefik.http.services.app.loadbalancer.server.port=8080" |
この場合、app1.example.comというドメイン名でアクセスするとTraefikがapp-service-1にリクエストを転送します。
デフォルトルートの簡易設定テクニック
サービスにラベルを指定せずにdefaultRuleを使用する例:
|
1 2 3 |
labels: - "traefik.http.routers.default.rule=Host(`{{ .Name }}.example.com`)" |
この設定では、app-service-1に対して自動的にapp-service-1.example.comというルールが適用されます。ただし、ドメイン名は事前にDNSで解決可能である必要があります。
Let's EncryptによるHTTPS証明書の自動取得設定
TraefikはLet's Encryptを活用し、証明書の自動取得と更新を行うことができます。これはローカル環境での開発にも役立ちます。
ACMEプロトコルを用いた証明書管理
以下のようにtraefik.ymlでACME設定を行います:
|
1 2 3 4 5 6 7 8 9 10 11 |
providers: docker: defaultRule: Host(`{{ .Name }}.example.com`) certificatesResolvers: letsencrypt: acme: email: [メールアドレス削除] storage: ./acme.json httpChallenge: entryPoint: web |
注意:ローカル環境ではDNSレコードを設定できないため、
Hostsファイルの編集が必要です。例:127.0.0.1 app1.example.com
ドメイン検証用のレコード設定方法
HTTPS証明書を取得するためには、下記のようなDNSレコードが必要です:
| 項目 | 値 | 補足 |
|---|---|---|
| ドメイン | app1.example.com |
実際のサービス名に置き換える |
| レコード種別 | A | IPアドレスを指定する |
| IPアドレス | 127.0.0.1 | ローカル環境ではlocalhostも可 |
実環境での注意点とトラブルシューティング手法
Traefikの導入にはいくつかの落とし穴があり、特にローカル環境で問題が発生した際は以下の対処法を確認しましょう。
ポート競合時の対処法
複数サービスが同じポートを使用するとエラーが出ます。回避策として:
docker-compose.yml内でportsセクションで別のホストポートを指定する- 内部ポート(例: 8080, 8081)で複数サービスを分離
証明書取得失敗時のログ確認手順
Traefikのロギングレベルを上げて詳細な情報を見ましょう:
|
1 2 3 |
log: level: DEBUG |
また、証明書が正しく取得されているかは、以下で確認可能です:
|
1 2 |
docker exec -it traefik cat /etc/traefik/acme.json |
まとめ
本記事ではTraefik Docker Compose 設定例を中心に、ローカル環境でのプロキシ構成手順を解説しました。ポイントを以下に整理します:
- docker-compose.ymlファイルの基本構造を理解し、サービス・ネットワーク・ボリュームを正しく設定する
- TraefikコンテナのポートマッピングでHTTP/HTTPSアクセスを実現
- ラベルによるルーティング設定で個別サービスへのアクセスを柔軟に構築
- defaultRuleオプションで簡易なルーティングを定義可能
- HTTPS証明書自動取得によりローカル環境でもセキュアな通信が可能
記事の設定例を基に、ローカル環境でTraefikを導入し、マイクロサービスのプロキシ構成を試してみてください。