Docker: Traefikでカスタムドメインを処理する
このドキュメントはHTTPSルーティングガイドの一部です。完全なガイドはこちらからご覧いただけます:DockerコンテナでのHTTPルーティングとTLS暗号化(HTTPS)の管理方法。
👋 Stackheroのドキュメントへようこそ!
Stackheroは、DockerクラウドCaaS (Containers as a Service) の即時利用可能なソリューションを提供し、多くの利点があります。例えば:
docker-compose upだけでコンテナを簡単に本番環境にデプロイ。- HTTPSで保護されたカスタマイズ可能なドメイン名(例: https://api.your-company.com, https://www.your-company.com, https://backoffice.your-company.com)。
- プライベートで専用のVMによる最適なパフォーマンスと強力なセキュリティ。
- ワンクリックでの簡単なアップデート。
時間を節約し、生活を簡素化:StackheroのDocker CaaSクラウドホスティング ソリューションを試して、コンテナを本番環境にデプロイするのに5分しかかかりません!
前の例では、デフォルトの<XXXXXX>.stackhero-network.comドメインを使用しました。実際には、www.my-company.comやapi.my-project.ioなどの独自の会社やプロジェクトのドメインを使用することが多いでしょう。以下のセクションでは、カスタムドメインの設定方法を説明します。
Traefikで最初のドメインを設定する
この例では、api.my-project.ioドメインを設定します。my-project.ioを所有するドメインに置き換え、apiを希望するサブドメインに置き換えてください。
まず、api.my-project.ioが<XXXXXX>.stackhero-network.comドメインを指すようにドメインのDNS設定を更新します。
- ドメインプロバイダーにログインし、DNS設定にアクセスします。
api(または希望する他のサブドメイン)という名前の新しいエントリを作成し、そのタイプをCNAMEに設定し、宛先を<XXXXXX>.stackhero-network.comに設定します。
Cloudflare DNSインターフェースでのDNS設定例
DNSが設定されたら、以下を実行して確認できます:
host api.my-project.io
次のような応答が表示されるはずです:
api.my-project.io is an alias for <XXXXXX>.stackhero-network.com
DNSの伝播はプロバイダーによって最大24時間かかる場合があります。
hostコマンドが期待される応答を返さない場合は、しばらく待ってから再試行してください。
次に、以下の設定でdocker-compose.ymlファイルを更新します:
services:
api:
image: traefik/whoami
hostname: api
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # ここにドメインを追加
- "traefik.http.services.api.loadbalancer.server.port=<PORT>" # "<PORT>"をAPIがリスニングしているポートに置き換える
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
Traefikラベル
Hostのapi.my-project.ioを実際のドメインに置き換えることを忘れないでください。
コンテナをデプロイするには:
docker-compose up -d
次に、https://api.my-project.ioを訪問します。コンテナのホスト名apiが表示されるテキストページが表示されるはずです。
新しいドメインのためにTraefikがHTTPトラフィックをTLS暗号化で処理している証拠
コンテナの初回作成時には、TLS証明書の生成に数秒かかる場合があります。 TLSエラーが発生した場合は、数秒待ってページを更新し、証明書が生成される時間を確保してください。
おめでとうございます、最初のカスタムドメインを設定しました!
Traefikを使用して「www」サブドメインをルートドメインにリダイレクトする方法
my-company.comのようなウェブサイトURLを定義する際には、「www」サブドメインも設定することをお勧めします。これにより、www.my-company.comを介して接続するユーザーがメインサイトにリダイレクトされ、重複コンテンツの問題を回避できます。
以下の例では、my-company.comとwww.my-company.comの両方が処理されます。www.my-company.comにアクセスするユーザーはmy-company.comにリダイレクトされます:
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # 両方のドメインをここに追加
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # "<PORT>"をフロントエンドがリスニングしているポートに置き換える
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# 'www.my-company.com'を'my-company.com'にリダイレクト:
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Traefikで特定のコンテナにパスをルートする
ドキュメントサイト専用のコンテナがあるとします。https://my-company.com/docsをこのコンテナにルートし、他のリクエスト(例えばhttps://my-company.com/)をフロントエンドコンテナに送信したい場合があります。以下の例では、これがどのように実現されるかを示しています:
services:
documentations:
image: traefik/whoami
hostname: documentations
labels:
- "traefik.enable=true"
- "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # ここでパスプレフィックスを定義
- "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # "<PORT>"をドキュメントコンテナがリスニングしているポートに置き換える
- "traefik.http.routers.documentations.tls.certresolver=letsencrypt"
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)"
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # "<PORT>"をフロントエンドがリスニングしているポートに置き換える
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# 'www.my-company.com'を'my-company.com'にリダイレクト:
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
これで、https://my-company.com/docs(またはhttps://my-company.com/docs/somethingのようなサブパス)を訪問すると、documentationsコンテナのコンテンツが表示されます。他のパス、例えばhttps://my-company.com/helpはfrontendコンテナによって提供されます。
Traefikでカスタムコンテナポートを定義する
デフォルトでは、Traefikはコンテナの最初に公開されたポートに接続します。場合によっては、特定のポートを指定する必要があるかもしれません。以下の例では、カスタムポートを定義する方法を示しています:
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`)"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# 'https://my-company.com'から'frontend'コンテナへのトラフィックをポート80でルート
- "traefik.http.services.frontend.loadbalancer.server.port=80"