Traefik:Docker向けの「万能」リバースプロキシ解決策(SSL自動化、5分で構築)

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

「ポート競合」という名の悪夢

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を発行します。ドメインにアクセスすれば、すぐに緑色の鍵マークが表示されるはずです。

トラブルを避けるための「鉄則」

以下は、私がデバッグに一晩中費やした際によく遭遇したエラーです。

  1. acme.jsonの権限: Traefikはセキュリティに非常に厳格です。SSLを保存するファイルの権限は600である必要があります。777などに設定していると、Traefikは “permissions are too open” というログを出力して起動を拒否します。
  2. Let’s Encryptの制限: 設定ミスをしたままコンテナを何度も再起動しないでください。短時間にSSL発行リクエストを送りすぎると、Let’s Encryptによって数時間IPがブロックされる可能性があります。
  3. ダッシュボード: ダッシュボード(ポート8080)を有効にする場合は、必ずBasic Authを使用してください。システムの構成図をハッカーに無料で公開してはいけません。

おわりに

NginxからTraefikへの移行は、マニュアル車からオートマ車に乗り換えるようなものです。最初はラベル(labels)による設定方法に戸惑うかもしれませんが、慣れてしまえばこれほど楽なものはありません。毎晩プロキシのエラー修正に追われるのではなく、プロダクトの開発に集中できるようになります。

もしマイクロサービスを運用しているなら、ぜひ今すぐTraefikを試してみてください。皆さんのシステムがスムーズに稼働することを願っています!

Share: