- Traefik は動的リバース プロキシとして機能し、TLS 証明書を解決します。一方、Portainer は Docker と Swarm を管理するためのグラフィカル インターフェイスを提供します。
- traefik.yml、dynamic.yml、docker-compose.yml を組み合わせることで、エントリポイント、セキュリティ ミドルウェア、ラベルベースの HTTP/HTTPS ルーティングを定義できます。
- Docker スタンドアロンまたは Swarm のシナリオでは、サービスをプロキシ ネットワークに参加させてタグ付けするだけで、Traefik が安全に検出して公開できるようになります。
- ダッシュボードで Let's Encrypt、専用ネットワーク、基本認証を使用することで、単一のサーバーに複数のアプリケーションを展開するための堅牢な環境が統合されます。
Docker、Traefik、Portainerを組み合わせた最新のスタックを構築することは、設定に煩わされることなく、単一サーバー上でコンテナを管理し、複数のサービスをHTTPSで公開する最も簡単な方法の一つです。Traefikが動的なリバースプロキシとして機能し、PortainerがDocker、そして必要に応じてSwarmも管理するための非常にシンプルなWebインターフェースを提供する点が大きな利点です。
この記事では、 Traefik を Portainer の前にリバースプロキシとして取り付ける 「クラシック」Docker(スタンドアロン)シナリオとDocker Swarmクラスタの両方で、TLS(自己署名またはLet's Encrypt)を統合する方法と、どのような構成ファイルが関係するか(traefik.yml, dynamic.yml y docker-compose.yml) および、ミドルウェア、ネットワーク、および Traefik の一般的なタグ付けの問題に関する一般的なトリックについて説明します。
アーキテクチャにおいて Docker、Traefik、Portainer はどのような役割を果たしていますか?
このタイプの構成では、Dockerはコンテナが実行されるベースレイヤーであり、Traefikはリバースプロキシおよびロードバランサーとして機能し、ポート80と443上のすべてのHTTP/HTTPSリクエストを受信して適切なコンテナに送信します。Portainerは、イメージ、コンテナ、ボリューム、ネットワーク、およびDockerまたはSwarmスタックを管理するためのグラフィカルインターフェースを提供します。
アイデアとしては、Dockerを単一のホストに置き、 トラエフィクは「ゲートウェイ」に位置している: エントリポイントで聞く web (80)Y websecure (443)は、TLS 証明書(通常は Let's Encrypt を使用)を解決し、Docker プロバイダーとの統合により、コンテナーにラベルを追加することで公開するサービスを自動的に検出します。
一方、Portainerは他のコンテナと同じように動作しますが、 特定のサブドメイン、例 portainer.tudominio.comTLSで保護され、必要に応じてPortainer自身のログインに加えて追加の認証ミドルウェアの背後で保護されます。これらすべては、 ドッカーの作成 Traefik、Portainer、そしてタイプの共通ネットワークを定義する proxy.
このアプローチの明確な利点は、コンテナにラベルを追加するだけで新しいサービスをデプロイできることです。TraefikはDockerの変更を検知し、ルーター、サービス、ミドルウェアをその場で作成するため、静的な設定ファイルを手動で変更することなく、数秒で新しいサブドメインやルートを起動して実行できます。
Traefik の静的設定: traefik.yml
Traefikの静的設定は通常、次のようなファイルに保存されます。 traefik.ymlコンテナ内に搭載されている。ここでは定義される ダッシュボード、エントリポイント、プロバイダー、証明書リゾルバー とりわけ、Let's Encrypt です。
典型的なYAML構成は、次のようなものでAPIとコントロールパネルをアクティブ化することから始まります。 api: dashboard: trueこれにより、ルーター、サービス、ミドルウェアを確認できるWebインターフェースにアクセスできるようになります。このパネルはデフォルトでは認証されていないため、後ほど動的設定からBasic認証を使用してセキュリティを確保する方法について説明します。
次に、エントリポイントを定義します。通常は、 エントリーポイント web ポート80 そしてもう一つ websecure 443に。 で web 自動リダイレクトは通常、 websecureすべての HTTP アクセスが HTTPS にリダイレクトされるようにします。
典型的なアウトラインには次のようなセクションが含まれます http.redirections.entryPoint.to: websecure リダイレクトを強制し、すべての暗号化されたトラフィックを安全なエントリ ポイントに集中させます。
へ websecure TLS を使用する必要があることが示されており、リンクが提供されています。 certResolver (たとえば letsencrypt)は証明書の自動管理を担当します。これらすべては、 ACMEこれは、Let's Encrypt が証明書の発行と更新に使用するプロトコルです。
ブロック内 プロバイダ Dockerプロバイダーはソケットを指すように設定されている unix:///var/run/docker.sock1 つの重要なオプション: exposedByDefault: falseこれにより、Traefikはデフォルトですべてのコンテナを公開するのではなく、ラベルが付いているコンテナのみを公開するようになります。 traefik.enable=trueファイルプロバイダを設定することもできます(file)を使用して、例えば、追加の動的構成をロードします。 /configurations/dynamic.yml.
最後に、静的ファイルには通常、次のセクションが含まれます。 certificatesResolversACMEリゾルバが定義されている場所:登録メール、保存ファイル(通常は acme.json)、キータイプ(例: EC384)と検証方法(例えば httpChallenge 入口で web重要なのは 実際のメールを設定する このセクションでは、Let's Encrypt が通知や更新にこれを使用するため、ダミーの値や不正な値を残すと、Traefik コンテナの起動時にエラーが発生する可能性があります。
このYAML構成に加えて、 TOML形式(traefik.toml)しかし、論理は同じです。セクションリゾルバ証明書(例えば [certificatesResolvers.main.acme])、課題を定義する(例えば dnsChallenge とともに provider = "route53")を追加し、次のようなデフォルトのTLSオプションを追加します。 forzar minVersion = "VersionTLS13" またはリストを設定する cipherSuites 許可証。
動的構成: ミドルウェア、TLS、セキュリティ
Traefikの動的部分は通常次のようなファイルに記述されます。 dynamic.ymlファイルプロバイダによってロードされます。ここで定義します ミドルウェアとTLSオプション これは、Traefik コンテナを再起動せずに変更できるため、セキュリティを即座に調整するのに非常に便利です。
典型的なケースとしては、例えばヘッダーミドルウェアの作成が挙げられる。 secureHeadersHSTSとHTTPSの必須使用に関するポリシーを追加します。YAMLでは、次のようなパラメータが見つかるかもしれません。 sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true と stsSeconds 高い(例えば、1年を秒単位で表す)値を設定します。これにより、ブラウザ側からのトラフィックセキュリティが強化されます。
もう一つの一般的なミドルウェアは、例えば基本認証用のものである。 user-auth タイプ basicAuth、ユーザーのリストは次の形式で宣言されます usuario:hashハッシュは通常、 htpasswd ファイルに埋め込まれています。このミドルウェアは通常、Traefikダッシュボードルーターに関連付けられているため、HTTPSアクセスに加えて、ユーザー名とパスワードが必要になります。
同じ動的構成内で、ブロックが見られるのが一般的です tls.options デフォルトプロファイル(default)には、サポートされている暗号と最小TLSバージョンが設定されます。例: VersionTLS12いくつかの展開では、複数のオプションが定義されています(たとえば、 tls12 そしてもう一つ default) を使用すると、必要に応じてさまざまなサービスにセキュリティ レベルを適応させることができます。
使用したい環境では TLSは内部的にも Traefikとバックエンドサービス(Portainerなど)の間で、これらのサービスがパブリックCAによって承認された証明書を持っていない場合に問題が発生する可能性があります。そこでこのオプションが役立ちます。 insecureSkipVerify、以下で構成されている providers.http.tls または適切なTLSオプションでこれを使用すると、Traefikはバックエンドの証明書検証をバイパスできます。これはラボ環境や社内の自己署名証明書には便利ですが、検証が緩くなるため注意して使用する必要があります。
実用的な詳細:ファイル dynamic.yml 即座に編集できます。Traefik は再起動を必要とせずに動的構成を再読み込みするため、プロキシの可用性に影響を与えずにミドルウェアを追加または削除したり、セキュリティ ヘッダーを変更したり、基本認証を変更したりできます。
Docker スタンドアロンで Traefik と Portainer を使用した docker-compose
Swarmを使わない裸のDockerシナリオでは、最も一般的なことは起動することです。 トラエフィクとポルテナーがシングルで docker-compose.yml これは、サービスと、例えば、共有ブリッジ型ネットワークの両方を定義します。 proxy.
サービス トレフィク 通常は公式画像を使用します。例えば traefik:latest または特定のバージョン traefik:v3.4ポートがマッピングされます。 80と443 ウェブトラフィック用ポート、そしていくつかの例ではコントロールパネルを内部的に公開するためにポート8080を使用します。さらに、オプションが追加されました。 restart: unless-stopped セキュリティは強化され、 security_opt: - no-new-privileges:true コンテナ内での権限昇格のリスクを軽減します。
ボリュームに関しては、Traefikは読み取り専用のDockerソケット(/var/run/docker.sock:/var/run/docker.sock:ro)コンテナを発見するために、静的ファイル traefik.yml 動的構成が保存されるディレクトリ(./traefik-data/configurations:/configurationsファイルもマウントされます。 acme.jsonTraefik はここに Let's Encrypt によって発行された証明書を保存します。このファイルはホスト上に作成され、権限が付与されます。 600 適切なユーザーだけが読み書きできるようにします。644 のままにしておくと、通常、Traefik がエラーを報告します。
トラエフィックの魔法の鍵は サービスラベルとりわけ、次のようなものがあります: traefik.enable=true (Dockerプロバイダーがこのサービスを公開するため) traefik.docker.network=proxy (Traefikがコンテナとの通信に使用するネットワークを示します)、そして次のようなルータ traefik.http.routers.traefik-secureエントリポイントを定義するラベル(websecure)、ホストルール(例えば Host(`traefik.tudominio.com`))、関連サービス(api@internal)と認証ミドルウェア(user-auth@file).
サービス ポーテナー 同じで docker-compose.yml 一般的に使用される portainer/portainer-ce:latest (またはライセンスをお持ちの場合はエンタープライズ版)。同様のボリュームがマウントされています:Dockerソケット、データフォルダ(./portainer-data:/data)そして多くの場合、 /etc/localtime ホストのタイムゾーンを継承するようになります。
Portainer のラベルは Traefik に登録されています。 traefik.enable=true, traefik.docker.network=proxyルータのタイプ traefik.http.routers.portainer-secure エントリポイント付き websecure そしてホストルールは Host(`portainer.tudominio.com`)さらに、Traefikが使用するサービスが定義され、Portainerの内部ポートを指します。たとえば、 traefik.http.services.portainer.loadbalancer.server.port=9000.
これらすべてが進行中で、打ち上げ後 docker compose up -d スタック ディレクトリでは、Traefik がイメージをダウンロードし、ネットワークを作成します。 proxy 外部として宣言され、構成されたサブドメインの両方のパネルを公開する場合、 Let's Encrypt による自動 HTTPSその時点から、新しいサービスを追加するには、プロジェクトを複製し、いくつかの Traefik ラベルを追加して、ネットワークに接続するだけです。 proxy.
Docker Swarmシナリオ: クラスター内のPortainerとTraefik
Docker Swarmをアクティブ化すると、サービスがスタックとしてデプロイされ、ネットワークが通常オーバーレイベースになるため、状況が少し変わります。ただし、TraefikとPortainerの基本的なロジックは非常に似ています。Traefikは引き続きリバースプロキシおよび動的サービスディスカバリとして機能し、PortainerはスタンドアロンモードとPortainer + エージェントモードの両方で動作して、クラスタ内のリモートノードを管理できます。
一般的な Swarm デプロイメントでは、スタックは適用される前に作成されます。 2つのオーバーレイネットワーク Traefikはこれを使用してノード間のトラフィックをルーティングします。さらに、Portainerデータを永続化するためのボリュームが作成されます(例: portainer_data)そして、必要であれば、 acme.json または、Traefik が証明書と構成を保存するディレクトリ。
El docker-compose.yml (その後、 docker stack deploy 例えば、 -c portainer.yml) は通常、次の 2 つのサービスを定義します。 ポルテナーエージェントモードで実行される global すべての Linux ノードと、通常はマネージャー上でのみ実行されるという制約付きで複製モードのままになるメインの Portainer サービス (CE または EE) です。
PortainerエージェントはDockerソケットとボリュームディレクトリ(/var/lib/docker/volumes)を使用してリソースを検査できます。Traefikと共有するオーバーレイネットワークに接続します。 traefik_publicメインPortainerサービスは、TCP経由でエージェントと通信するように設定できます(tcp://tasks.agent:9001)そして実際、いくつかの例ではそのコマンドは --tlsskipverify 必要に応じて TLS 検証をスキップするようにコメントしました。
同じスタックまたは別のスタックで、TraefikはDockerプロバイダーをSwarmモードで起動します(swarmMode = true タグ付けされたサービスを監視するために、TOMLまたはフラグの同等のオプションを使用します。その設定には、 certificatesResolvers.main.acme Let's Encryptでは、 dnsChallenge サプライヤーとの 国道53号線 DNSで証明書を検証したい場合、 tls.options 例えば、強制的に minVersion = "VersionTLS13" デフォルトプロファイルと明示的なリストが定義されています cipherSuites TLS 1.2 プロファイルの場合。
Swarm の Portainer のラベルも同じ哲学に従っています。 traefik.enable=trueルーターのような traefik.http.routers.portainer とともに Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (命名によると)、そして traefik.http.routers.portainer.tls=true ルーターでTLSを有効にするには、 証明書リゾルバ とともに traefik.http.routers.portainer.tls.certresolver=main サービスが内部的にHTTPSを使用する場合のバックエンドスキーマ traefik.http.services.portainer.loadbalancer.server.scheme=https.
SwarmのTraefikデバッグログには、生成された構成が表示されます。ルータは次のようになります。 api y portainer、検出されたサービス(例: portainer en http://10.0.1.12:9000 そしてサービス traefik (ダッシュボードのポート8080を指しています)そして、ラベルの定義が不十分な場合は、次のようなメッセージが表示されます。 「ルーターのサービス名を定義できませんでした: サービスが多すぎます」これは通常、ルーターに関連付けられたサービスの競合または重複があることを示します。
最小限の例: Traefik を使用した whoami、ルート、TLS
Portainer を導入する前に、画像のように非常にシンプルなバックエンドで Traefik を試してみるのは非常に実用的です。 traefik/whoamiリクエストに関する情報を返します。これにより、Traefikが正しく設定され、ルーティングルールが機能していることを検証できます。
Un docker-compose.yml 基本にはサービスが含まれる場合があります traefik 画像付き traefik:v3.4Dockerソケットをマウントし、ブートフラグを次のように定義します。 --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy そしてエントリーポイント --entryPoints.web.address=:80ポート 80 と 8080 がホスト上でアドバタイズされ、ネットワークが作成されます。 proxy コンテナも使用する whoami.
サービス whoami 同じネットワーク上で開始され、 traefik.enable=true次に、ルータはラベルで定義されます traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) そして、あなたのエントリーポイントは webリクエストを送信した場合 curl -H "Host: whoami.docker.localhost" http://localhost/ホスト名、IP、ヘッダーなどを含む応答が表示され、Traefik が正しくルーティングしていることが確認されます。
そこからは簡単です。 パスによるルーティングを追加するたとえば、別のサービスを作成することができます。 whoami-api 同じ画像、同じネットワークで、次のようなルールでタグ付けします。 Host(`whoami.docker.localhost`) && PathPrefix(`/api`)したがって、ルート / に行く whoami オリジナルとリクエスト /api 彼らに仕えるだろう whoami-apiこれを確認するには、 / すでに /api 同じホストで。
有効にするには TLS このローカル環境では、ドメインの自己署名証明書を生成するという選択肢があります。 *.docker.localhost とともに opensslディレクトリを作成する certs、あなたは生成します local.key y local.crt、そして動的ファイル(例えば dynamic/tls.yml)のセクション tls: そしてルート certFile y keyFile それらのファイルを指します。
次に、Traefikのサービス定義を更新します。 docker-compose.yml フォルダをマウントする ./certs とフォルダ ./dynamic コンテナ内では、セキュアAPIを有効化します。 --api.dashboard=trueエントリポイントを作成します websecure (--entryPoints.websecure.address=:443)でTLSを有効にします --entryPoints.websecure.http.tls=trueダッシュボードのルーターとルーターにもラベルを付けます whoami 彼らが使うために websecure そして持っています tls=true.
公開後は、アクセスできるようになります https://whoami.docker.localhost/ ブラウザのセキュリティ警告を受け入れ、自己署名証明書を使用してTraefikパネルにアクセスします。この操作は、Let's Encryptを本番環境で使用する場合と非常に似ていますが、パブリックDNSサーバーに依存しません。
ベストプラクティス、アプリの導入、一般的な問題の解決
これらの例すべてに共通するパターンは、 Traefikは新しいアプリケーションの導入を大幅に簡素化しますベーススタック(Traefik + Portainer + ネットワーク)ができたら proxy (+ 証明書)、新しいサービスを追加すると、通常は次のようになります。
プロジェクトを複製するか、 docker-compose.yml サーバーにサブドメインをホストのIPアドレスにポイントするには、 レコードA DNSで(例えば app.tudominio.com) を作成し、サービスにキーラベルを追加します。 traefik.enable=true, traefik.docker.network=proxy そして、そのサブドメインのホストルールを持つルータは、安全なエントリポイントを指定します websecure Y·エル 正しい内部ポートを持つサービス.
多くのチュートリアルでは、例えば小さなアプリの展開が紹介されています FastAPI 分離:4つのラベルが追加され、ネットワークへの参加が保証される proxy セクションで networks インクルード docker-compose.ymlそしてその後 docker compose up -d アプリはTLSが有効になった状態でTraefikダッシュボードに自動的に表示されます。Traefikの自動検出機能により、静的な設定を調整する必要さえありません。
すべてがスムーズに実行されるようにするには、いくつかの詳細に注意することが重要です。 同じルータ識別子を再利用しないでください さまざまなアプリで、各ルーターに関連付けられているサービスが1つだけであることを確認し(「サービスが多すぎます」というエラーを回避する)、一貫したネットワーク名を使用します(例: proxy 公開したいすべてのスタックで、Let's Encrypt を使用している場合は、 acme.json 権限は 600 で、設定された電子メールは有効です。
Swarm 環境では、Traefik 構成に Docker プロバイダーが含まれていることも確認してください。 swarmMode=true y watch=trueそして、サービスの制約(例えば node.role == manager (Portainerの場合)Traefikのデプロイ先と競合しません。デバッグログは非常に詳細ですが、ルーティングやTLSの問題を特定する上で重要です。
Docker、Traefik、Portainerを組み合わせることで、グラフィカルなダッシュボード、自動証明書、非常に高速なデプロイフローを備えた、軽量なオーケストレーション環境を単一サーバー上に構築できます。サービスの追加、更新、削除は、YAMLファイルを数行変更するだけで済み、リバースプロキシやTLSといった面倒な作業はTraefikに任せることができます。
