第20章:ここから自動化ルート:Traefik入門🚦🤖
この章は「リバプロ設定を“手書き”から“自動増殖”へ」切り替える回だよ〜✨ Caddy/Nginxみたいに「入口の設定ファイルを毎回いじる」より、Traefikは “各アプリ側にラベルを貼る”だけで、入口が勝手に増えるのが強み👍 (Dockerイベント監視もデフォでONだよ)(doc.traefik.io)
1) 今日のゴール🎯✨
http://whoami.localhostとhttp://app.localhostを ポート増やさずに同居させる🚪🏠🏠- 「ルーティングはTraefik、ルールは各サービスのlabels」って感覚を掴む🏷️🧠
- **“502になったらポート指定”**が自然に出てくるようにする🔥(doc.traefik.io)
2) まず“Traefik脳”を作る🧠🔧(この3語だけでOK)
Traefikは基本、これだけ覚えれば回り始めるよ👇
- Entrypoint:入口のポート(例:
:80)🚪 - Router:どのURLをどこへ流す?(例:
Host(\app.localhost))🪧 - Service:実際の転送先(=コンテナの内部ポート)📦
- Middleware:途中でちょい加工(後で使う:/apiを剥がす等)🧴
Traefikはコンテナを見つけると、containerごとにrouter/serviceを自動で作ったりできる(labelsで上書きする)ってイメージね🙂(doc.traefik.io)
3) 最小構成を作る📦🐳(Traefik + 2アプリ)
フォルダ構成🗂️
こんな感じで作るよ〜👇
ch20-traefik-intro/
compose.yaml
app/
index.html
app/index.html(超テキトーでOK)📝✨
<!doctype html>
<html>
<head><meta charset="utf-8" /><title>app</title></head>
<body>
<h1>app.localhost で見えてたら勝ち🎉</h1>
<p>Traefik でホスト名ルーティングできてるよ〜🚦</p>
</body>
</html>
compose.yaml(この章のメイン!)🔥
ポイントは3つ👇
- Traefikは 80/8080だけ外に出す(アプリ側のportsは基本いらない)
exposedByDefault=falseにして、見せたいコンテナだけtraefik.enable=true- 同じネットワークに置いて、Traefikが中へ流せるようにする🧵
name: ch20-traefik-intro
services:
traefik:
image: traefik:v3.6.8
command:
- --api.insecure=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --entrypoints.web.address=:80
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy
whoami:
image: traefik/whoami:v1.11.0
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
- traefik.http.routers.whoami.entrypoints=web
networks:
- proxy
app:
image: nginx:alpine
volumes:
- ./app:/usr/share/nginx/html:ro
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.localhost`)
- traefik.http.routers.app.entrypoints=web
networks:
- proxy
networks:
proxy:
name: proxy
- Traefikの「Docker provider有効化」「80と8080」「
--api.insecure=true」の超基本は公式のQuick Startの流れそのまま👌(8080はダッシュボード用。後章で安全に扱うよ)(doc.traefik.io) providers.docker.exposedByDefaultは「デフォで公開するか」の設定。trueがデフォだから、学習段階からfalseにしとくと事故りにくい✨(doc.traefik.io)- この章の時点(2026-02-12)でTraefikは v3.6.8 が出てるよ🆕(GitHub)
whoamiのタグはv1.11.xがまとまって使われてるやつ(Docker Hubにtag一覧ある)(hub.docker.com)
4) 起動して見てみよう👀🚀
PowerShellで👇
cd ch20-traefik-intro
docker compose up -d
docker compose ps
ブラウザで開く👇
http://whoami.localhost✅http://app.localhost✅http://localhost:8080/dashboard/✅(Traefikダッシュボード)(doc.traefik.io)
💡補足:*.localhost は環境によっては追加設定なしでローカル解決してくれる(特にChromium系でそういう挙動が案内されてる)よ〜🧠✨
もし開けなかったら、前章のhosts設定(whoami.localhost / app.localhost を 127.0.0.1 に向ける)を入れるとOK🙆♂️(Docker Documentation)
5) “ラベルで増える”を体験する💥(サービス追加=labels追加)
ここからが本番😺 Traefik側の設定はいじらず、サービスを追加してlabels書くだけで入口が増えるのが気持ちいいやつ✨
例:ポートが80じゃないサービスを追加(= 502対策も覚える)🧯
hashicorp/http-echo はデフォで 5678 を使うよ(hub.docker.com)
Traefikは「コンテナの最初のexposed port」を使うのが基本なので、明示しておくと安定👍(間違うと502の代表例)(doc.traefik.io)
compose.yaml にこれを追記👇
echo:
image: hashicorp/http-echo:latest
command: ["-text=echo.localhost で見えてたらOK🎉"]
labels:
- traefik.enable=true
- traefik.http.routers.echo.rule=Host(`echo.localhost`)
- traefik.http.routers.echo.entrypoints=web
- traefik.http.services.echo.loadbalancer.server.port=5678
networks:
- proxy
反映👇
docker compose up -d
開く👇
http://echo.localhost✅
✅ここが今日いちばん大事: **「ルールはアプリ(labels)に持たせる」=“追加が怖くない”**🎉
6) labelsの“読み方”チートシート🏷️📌
labelsは長いけど、分解すると一瞬で読めるよ😇
traefik.http.routers.<名前>.rule=Host(\xxx)→ 「このHostなら、このrouterに入れる」🪧traefik.http.routers.<名前>.entrypoints=web→ 「入口は80番にする」🚪traefik.http.services.<名前>.loadbalancer.server.port=5678→ 「転送先の内部ポートは5678」📦 (Traefikが間違ったポートを見に行くと 502 になりがち。ここで上書きする)(doc.traefik.io)traefik.enable=true→ 「このコンテナはTraefik管理対象に入れて〜」🙋♂️ しかもこれはexposedByDefaultを上書きするよ(doc.traefik.io)
7) ⚠️地雷:labelsに秘密を書くな💣🔑
Traefik公式でも「labelsは秘密情報を入れる場所じゃない」って注意されてるよ〜😵💫 (dockerのinspectやUIから見えることがあるからね)(doc.traefik.io)
➡️ パスワードやAPIキーは、後で出てくる「環境変数」「secrets」「外部設定ファイル」側に寄せよう🙆♂️
8) よくある詰まりポイント辞典📕🧯(この章だけで直せるやつ)
A) 404が出る😇
だいたいこれ👇
Host(\app.localhost)のスペルミス- ブラウザが別Hostでアクセスしてる(
localhostで開いちゃってる等) - ルータが作られてない(
traefik.enable=true忘れ)(doc.traefik.io)
✅確認
docker compose logs traefik --tail 100
ダッシュボードで Routers を見るのが早い👀📊(次章で安全運用する)
B) 502が出る😵💫
これが王道👇
- Traefikが 違うポートへ転送してる
→
traefik.http.services.<name>.loadbalancer.server.port=XXXXを正しく書く!(doc.traefik.io)
C) 80番がすでに埋まってる🚧
別のWebサーバ(IIS/他のリバプロ)が80を使ってるとTraefikが起動できない💥
→ その場合はこの章だけ 一時的に 8081:80 みたいに逃がしてOK(本筋は「入口1個」なので後で戻す)
9) Copilot / Codex に投げる“勝ちプロンプト”例🤖✨
例1:labelsを自動生成してもらう🏷️
docker compose の service に付ける Traefik v3 の labels を作って。
要件:
- host は admin.localhost
- entrypoint は web(:80)
- 転送先のコンテナ内部ポートは 3000
- exposedByDefault=false 前提なので traefik.enable=true も付ける
出力は labels の配列だけでOK
例2:502の切り分け手順を作ってもらう🧯
Traefik v3 + Docker Compose で 502 が出る。
原因を「ポート」「ネットワーク」「ルール不一致」に分けて、
確認コマンド(docker compose logs/ps 等)込みで手順を書いて。
10) ミニ課題🎮(やると“自動化”が体に入る)
課題A:3つ目のアプリを増やす🎉
admin.localhostを増やす- 中身は
traefik/whoamiでもnginxでもOK - **「Traefik側はいじらない」**を守るのが勝ち🏆
課題B:わざと502を起こして直す😈➡️😇
echoのserver.portを9999にして 502 を出す- 正しい
5678に戻して復旧 「502=ポート疑え」が脳に刻まれる🔥(doc.traefik.io)
課題C:Middlewareを“1個だけ”入れてみる🧴
(Middlewareは次の章以降で本格的にやるけど、触ると楽しい✨)
たとえば /admin で来たら app に流す(PathPrefix)+prefix剥がす(StripPrefix)みたいなのは、labelsで宣言できるよ〜(仕組みだけチラ見)(doc.traefik.io)
11) この章の“卒業チェック”✅🎓
-
docker compose up -dでTraefik + 複数サービスが立つ -
app.localhost/whoami.localhostがポート増やさず開く - サービス追加は「labels追加」でいける感覚がある
- 502が出たら
loadbalancer.server.portを思い出せる(doc.traefik.io) - labelsに秘密を書いちゃダメがわかる(doc.traefik.io)
次の第21章は、**便利すぎるTraefikダッシュボードを“安全にローカル運用する”**回だよ🧯📊
今のままだと --api.insecure=true で便利だけど、扱いを間違えると危ないので、ちゃんと“安全な見える化”にしていこう〜✨(doc.traefik.io)