Docker環境で使えるTraefik入門：Nginxとの違い・構成・設定例までざっくり解説

# Traefik入門：コンテナ時代のリバースプロキシをもっと楽に使おう

「Nginxの設定って、コンテナ増えるとめんどくさい…」
そんな悩みを抱えていた自分が出会ったのが、Traefikです。

Traefikは、Dockerとの相性抜群のリバースプロキシで、以下のような特徴があります。

- 各コンテナにラベルを貼るだけで自動ルーティング
- HTTPS対応も自動（Let's Encrypt組み込み）
- 軽量でシンプル、設定ファイルがほぼ不要

特に「**Nginxは知ってるけど、もっと楽にしたい**」「**リバースプロキシ初心者で...**」という方におすすめのツールです。（私の実体験でもありますが。）
この記事では、Traefikの特徴、Nginxとの比較、設定例、そして活用ユースケースまで紹介します。

## 1. Traefikの特徴（概要）

まずは、Traefikって結局何が便利なの？という視点で、主な特徴をざっと整理してみます。
Nginxなどに慣れている方にとっては、「これが自動でできるの？」という驚きポイントが多いと思います。
以下の表では、Traefikの代表的な機能や強みを一覧にしています。

| 特徴                                  | 説明                                                                                      |
| ------------------------------------- | ----------------------------------------------------------------------------------------- |
| 🔄 自動ルーティング                  | Dockerのlabelsを読むことで、自動でルーティング設定を構築                                |
| ⚙️ 設定がコンテナ側に分散            | 各サービス（コンテナ）が自己紹介するスタイルで、Traefik本体は静的設定が最小限           |
| 🔍 サービス名と内部ポートで識別      | `loadbalancer.server.port` などから通信先を決定                                          |
| 🧠 動的な構成検出（Auto Discovery）  | 新しいコンテナの追加にも即座に対応                                                       |
| 🔐 HTTPS対応が自動（Let's Encrypt）  | HTTPS証明書の取得と更新を完全自動化                                                      |
| 📊 ダッシュボードで状況可視化        | Web UIでルーティングや証明書の状態を確認可能                                             |
| 📦 軽量 & モダン                     | Go製で構成ファイルもシンプル。Docker/K8sに特化した構成に最適                             |

## 2. TraefikとNginxの違いをざっくり比較

| 比較項目         | Traefik                       | Nginx                      |
| ---------------- | ----------------------------- | -------------------------- |
| 設定方法         | コンテナごとのラベルベース    | 中央集権的な設定ファイル   |
| 自動検出         | あり（Docker/K8sと連携）      | 基本なし（手動で記述）     |
| HTTPS証明        | 自動（Let's Encrypt組み込み） | 手動設定 or 別ツールが必要 |
| UIダッシュボード | 標準搭載                      | なし（別途導入必要）       |
| モダンな運用     | 得意（DevOps向け）            | 静的構成に向く              |
| コンテナ連携     | 得意                          | 可能だがやや複雑           |

「構成が静的で、Webサーバ的に使いたいならNginx。コンテナベースで動的な構成ならTraefik」というイメージです。

Traefikは単体でも利用可能ですが、その場合は結局 `traefik.yml` などの設定ファイルを用意して静的にルーティングを記述する必要が出てきます。（※筆者未検証）

このような用途であれば、Nginxのほうがシンプルで向いているケースが多いでしょう。

### 2.1. なぜ、Nginxを利用するほうが良いのか

少し補足的な内容になるため、まずはTraefikの使い方をざっくり掴みたい方は、このセクションは読み飛ばしても問題ありません。

以下の通りです。

| 機能                        | Traefik    | Nginx     |
| :-------------------------- | :--------- | :-------- |
| リバースプロキシ            | ◎          | ◎         |
| 静的ファイルの直接配信      | ❌（不可） | ◎（可能） |
| HTML/CSS/JSをそのまま返せる | ❌         | ◎         |
| 別の静的サーバと連携        | ◎（得意）  | ◎         |

つまり、Nginxは静的ファイルの配信ができますが、Traefikにはそれができません。
Nginxだと以下のことができます。

- /usr/share/nginx/html/index.html にファイルを置く
- nginx.conf でルート指定
- ブラウザから <http://example.com/> でアクセス → index.html をそのまま返す

Nginxをコンテナで利用している場合は、コンテナからbuild結果を参照できるように以下の手段をとると思います。

- build結果に対してボリュームマウントする
- ステージングビルドを利用してindex.htmlを作成する

「えっ、じゃあフロントエンドの `index.html` はどうやって配信するの？」と思った方、私も最初まったく同じ疑問を持ちました。

最後にも記載するのですが、私の知っている限りTraefikを利用しても配信用サーバは必要です。私の場合は、Nginxのコンテナは立ち上げます。[コードサンプル](https://qiita.com/drafts/7f6bdf6f1af615620065/edit#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E6%96%B9%E6%B3%95)

## 3. Traefikの仕組みをもう少しだけ掘り下げる

### 3.1. 設定がコンテナ側に分散されている

Traefikでは、各コンテナが自分でルーティング情報をラベルで持ちます。
この「**自己紹介型の構成**」により、Traefik本体は複雑な設定ファイルを書かずにすみます。

```yaml
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.example.rule=Host(`example.local`)"
  - "traefik.http.services.example-svc.loadbalancer.server.port=8080"
```

このように、コンテナ自身が「自分はこう扱ってね」とルールを提示し、それをTraefikが自動で拾ってルーティングを生成します。

### 3.2. サービス名とポートでの識別

ルーティング先のサービスは、以下のように指定します：

```yaml
traefik.http.services.<サービス名>.loadbalancer.server.port
```

このサービス名はTraefik内部での識別名で、実際はDockerコンテナの該当ポートにルーティングされます。
ホスト名との組み合わせで、同じイメージのコンテナを複数並列運用しても問題なしです。

### 3.3. 動的な構成検出（Auto Discovery）

Traefikは、DockerやKubernetesと連携して、起動中のサービスを常時監視しています。
新しいコンテナが立ち上がれば、自動でルーティング設定が反映されます。

例：APIサーバを api.local に追加したい時、コンテナを起動するだけで即反映。再起動も不要です。

docker-compose.ymlを利用してCLIを叩くときのイメージだと、

```bash
docker compose ―f docker-compose.traefik.yml up -d
```

でtraefikコンテナを立ち上げた後に以下のように単体で立ち上げてもコンテナを認識してくれます。

```bash
# docker compose up -d でも良いが、以下のように個別で立ち上げても認識する。
docker compose up -d backend
docker compose up -d db
```

## 4. 実際の設定例

ここからは、Docker Compose を使った具体的な設定例を紹介します。あくまで設定の抜粋であるため、これだけでは動かないことに注意が必要です。

frontendとbackendに必要な設定は原則同じです。サービス名、ポート、ホスト名が異なるのは当然ですが、 **コンテナが自身の情報を宣言していることが特徴です。**
networksがtraefik-publicに属していることでtraefikが見つけてくれます。
DBが必要な構成でも同じようにネットワークとlabelsの設定をすれば利用できるということですね。

### 4.1. アプリケーションのコンテナ

#### **frontendコンテナ**

```yaml
frontend:
  image: '使用したイメージ名'
  networks:
    - traefik-public
    - default
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.frontend.rule=Host(`frontend.local`)"
    - "traefik.http.services.frontend-svc.loadbalancer.server.port=80"

```

#### **backendコンテナ**

```yaml
backend:
  image: '使用したイメージ名'
  networks:
    - traefik-public
    - default
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.backend.rule=Host(`api.local`)"
    - "traefik.http.services.backend-svc.loadbalancer.server.port=8000"

```

### 4.2. **traefik本体の設定**

traefikの設定では、httpで受けるホストの設定やポートの設定が行われていて、 **frontendやbackendの情報が全く含まれない**ことが特徴です。
compose内のcommandで起動時のオプションが設定されています。（entrypoint等）

```yaml

traefik:
  image: traefik:3.0
  ports:
    - 80:80
  networks:
    - traefik-public
  labels:
    - traefik.enable=true
    - traefik.docker.network=traefik-public
    - traefik.http.services.traefik-dashboard.loadbalancer.server.port=8080
    - traefik.http.routers.traefik-dashboard-http.entrypoints=http
    - traefik.http.routers.traefik-dashboard-http.rule=Host(`traefik.local`)
  command:
    - "--api.dashboard=true"
    - "--providers.docker=true"
    - "--entrypoints.http.address=:80"
```

## 5. 活用例・ユースケース紹介

実際に「どんな場面で使えるか」を紹介します。
どれもシンプルな構成で、Traefikの強みがよく活きる例です。

### 5.1. ローカル開発環境でHTTPSを手軽に

- frontend.local や api.local にHTTPSでアクセスしたい
- localhost証明書の設定に苦労したくない

→ Traefikで Let's Encrypt or 自己署名証明書がすぐ使える

### 5.2. 複数プロジェクトを同時に動かす開発マシンに

- プロジェクトAは a.local、プロジェクトBは b.local にしたい
- コンテナ群を個別に立ち上げて切り替えたい

→ すべてのリクエストを1つのTraefikが自動で分配

### 5.3. 社内ツールをまとめるゲートウェイとして

```txt
admin.local     → 管理画面（Node.js）
docs.local      → ドキュメントツール（Python）
dashboard.local → Grafana
```

## 6. まとめ

Traefikは、Nginxのような高機能な設定を持たない代わりに、
**「設定レス」「コンテナネイティブ」「自動化された運用」** が魅力のリバースプロキシです。

- Docker環境でのHTTPSやルーティングが面倒な方
- 複数サービスをまとめたい方
- Nginxのメンテナンスが煩雑に感じる方

そんな方にこそ、一度Traefikを試してみてください。

コンテナを利用しているECSやk8sとも相性がいいので、今後発展として利用してみたいと思います。

## 7. Traefikをもっと深く知る：本格的なプロジェクト例と記事紹介

最後に、Traefikの具体的な利用例として参考になるプロジェクトをご紹介します。

特に、実際の構成やファイルを確認したい方、もっと深くTraefikの使い方を知りたい方におすすめです。

### 7.1. full-stack-fastapi-template

- [full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)

上記のリポジトリのdeploy.mdを見ていただきますと、traefikのおおよその利用方法がわかります。実際の運用イメージを膨らませたい方は確認してみてください。

実際の手順の中では、

- traefikのダッシュボードを見るためのユーザー設定や、DOMAIN設定が必要
- HTTPSの設定のためにLet's Encrypt への登録が必要

構築時の手順は以下のようになります。

1. ネットワークの構築
   1. アプリケーション側のコンテナのネットワークは、traefik-publicに属します。

    ```bash
    docker network create traefik-public
    ```

2. 環境変数の設定

    ```bash
    export USERNAME=admin
    export PASSWORD=changethis
    export HASHED_PASSWORD=$(openssl passwd -apr1 $PASSWORD)
    export DOMAIN=fastapi-project.example.com
    # export EMAIL=<admin@example.com>
    ```

3. traefik単体のコンテを立ち上げ

    ```bash
    docker compose -f docker-compose.traefik.yml up -d
    ```

4. アプリケーションのコンテナを立ち上げ
   1. プロジェクト内に.envがあるので設定関係については注意
   2. docker-compose.override.ymlを持つ構成である点に注意

    ```bash
    docker compose -f docker-compose.yml up -d
    ```

このプロジェクトは本番運用を意識しているため、HTTPSやドメイン設定なども含まれており、少し大がかりです。
ローカルで軽く試してみたい場合やPoC（検証）目的であれば、以下のような構成要素は省略して問題ありません。
例えば以下に関する設定を変更すれば小規模化することが可能です。

- tlsの設定やHTTPSのentrypointの設定を削除
- DOMAINの設定の変更

#### フロントエンドのデプロイ方法

このプロジェクトでは、Nginxを配信サーバ（コンテナ）として立ち上げています。
frontendのコンテナのdockerfileの内容を抜粋しています。

```docker
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:20 AS build-stage

WORKDIR /app

COPY package*.json /app/

RUN npm install

COPY ./ /app/

ARG VITE_API_URL=${VITE_API_URL}

RUN npm run build


# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1

COPY --from=build-stage /app/dist/ /usr/share/nginx/html

COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./nginx-backend-not-found.conf /etc/nginx/extra-conf.d/backend-not-found.conf

```

### 7.2. Traefikについての記事

もっと詳しくなりたい方向け

- [Traefik Proxyに入門してみたメモ（Qiita）](https://qiita.com/everylittle/items/ae0a72658fea3061f129)
  - 手を動かしながら、学ぶならここから始めるのがいいと思います。
- [Traefikマーシャラーになろう（Zenn）](https://zenn.dev/pitekusu/books/traefik-pitekusu/viewer/introduction)
  - 1から解説しているので、読み物としてもわかりやすいと思います。