「ポート競合」という名の悪夢
1台のVPSに3〜4つのウェブサイトをデプロイしようとして、困り果てたことはありませんか?サイトAがポート80を使いたいと言い、サイトBも同じポートを譲らない。結局、サイトBをポート8081で動かすことになり、ユーザーはアクセスのたびにURLの後ろにポート番号を入力しなければならなくなります。これではプロフェッショナルとは言えませんし、セキュリティ面でも不安が残ります。
私が以前、アパレルショップのプロジェクトを担当した際、Nginxを手動で設定するのに苦労しました。新しいランディングページを追加するたびに、サーバーにSSHでログインし、nginx.confを修正してreloadを実行していました。ある時、セミコロン(;)を一つ忘れただけでNginxが停止してしまいました。広告を大量に出稿して注文が殺到している最中に、システム全体が15分間もダウンしてしまったのです。そのショックから、私は自動化できる解決策を必死に探しました。そして出会ったのが、救世主「Traefik」でした。
比較:TraefikはNginxと何が違うのか?
コマンドを打ち始める前に、なぜTraefikがDevOpsの新たな標準になりつつあるのかを確認しておきましょう。
- 従来のNginx: パフォーマンスは非常に優れていますが、設定は「職人の手作業」に頼る部分が多いです。ドメインごとに設定ファイルを書く必要があり、90日ごとのSSL更新のためにCertbotを自分でセットアップしなければなりません。
- Nginx Proxy Manager (NPM): 使いやすいWeb UIを備えています。しかし、20〜30個のコンテナをコード(Infrastructure as Code)で管理したい場合、UIでの操作が逆にボトルネックになることがあります.
- Traefik Proxy: これはDocker専用に設計されたようなツールです。長い設定ファイルを書く必要はありません。代わりに、TraefikはDocker Socketを監視し、新しいコンテナが「立ち上がった」ことを自動的に検知します。
画期的な「Configuration Discovery(構成の自動発見)」思想
Traefikの最大のメリットは、サービスを自動的に発見する能力です。プロキシ側にサービスを登録するのではなく、Traefikが自らDockerに対して「新しいサービスはあるか?」と問いかけます。
この時、コンテナ側には「私のドメインは app.com です」といったラベル(label)を貼っておくだけで済みます。Traefikは自動的にトラフィックの経路を作成し、Let’s EncryptからSSL証明取得します。これらすべてが、わずか10秒足らずで自動的に完了します。
Traefikの実戦導入
DockerがインストールされたクリーンなVPSと、サーバーのIPを指すAレコードが設定されたドメインを用意してください。
ステップ1:ネットワークの作成
Traefikが他のコンテナと隔離された環境で通信できるように、仮想ネットワークを作成します。
docker network create web_proxy
ステップ2:実行ファイルの構成
traefikディレクトリを作成し、その中にシステムの心臓部となるdocker-compose.ymlを作成します。
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=admin@yourdomain.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
networks:
- web_proxy
exposedbydefault=falseという行に注目してください。これはサーバーを保護するための設定です。明示的に許可を与えたコンテナのみが、Traefikによってインターネットに公開されます。
ステップ3:アプリのデプロイと成果の確認
簡単なウェブアプリを動かしてみましょう。Traefikの設定ファイルを修正する必要はもうありません。アプリ側のファイルに数行のlabelsを追加するだけです。
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`blog.yourdomain.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls.certresolver=myresolver"
up -dコマンドを実行すると、Traefikが自動的にSSLを発行します。ドメインにアクセスすれば、すぐに緑色の鍵マークが表示されるはずです。
トラブルを避けるための「鉄則」
以下は、私がデバッグに一晩中費やした際によく遭遇したエラーです。
- acme.jsonの権限: Traefikはセキュリティに非常に厳格です。SSLを保存するファイルの権限は
600である必要があります。777などに設定していると、Traefikは “permissions are too open” というログを出力して起動を拒否します。 - Let’s Encryptの制限: 設定ミスをしたままコンテナを何度も再起動しないでください。短時間にSSL発行リクエストを送りすぎると、Let’s Encryptによって数時間IPがブロックされる可能性があります。
- ダッシュボード: ダッシュボード(ポート8080)を有効にする場合は、必ず
Basic Authを使用してください。システムの構成図をハッカーに無料で公開してはいけません。
おわりに
NginxからTraefikへの移行は、マニュアル車からオートマ車に乗り換えるようなものです。最初はラベル(labels)による設定方法に戸惑うかもしれませんが、慣れてしまえばこれほど楽なものはありません。毎晩プロキシのエラー修正に追われるのではなく、プロダクトの開発に集中できるようになります。
もしマイクロサービスを運用しているなら、ぜひ今すぐTraefikを試してみてください。皆さんのシステムがスムーズに稼働することを願っています!

