Ubuntu16.04でDockerコンテナのリバースプロキシとしてTraefikを使用する方法
序章
Docker は、本番環境でWebアプリケーションを実行するための効率的な方法ですが、同じDockerホストで複数のアプリケーションを実行したい場合があります。 この状況では、ポートのみを公開する必要があるため、リバースプロキシを設定する必要があります 80
と 443
世界の残りの部分に。
Traefik は、独自の監視ダッシュボードを含むDocker対応のリバースプロキシです。 このチュートリアルでは、Traefikを使用して、リクエストを2つの異なるWebアプリケーションコンテナーにルーティングします。WordPressコンテナーとAdminerコンテナーで、それぞれがMySQLデータベースと通信します。 Let’s Encrypt を使用して、HTTPS経由ですべてを提供するようにTraefikを構成します。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
-
サーバーにDockerがインストールされています。これは、 Ubuntu16.04にDockerをインストールして使用する方法に従って実行できます。
-
Ubuntu16.04にDockerComposeをインストールする方法の手順に従ってインストールされたDockerCompose。
-
ドメインと3つのAレコード、
db-admin
,blog
とmonitor
、それぞれがサーバーのIPアドレスを指していること。 DigitalOceanのドメインとDNSドキュメントを読むことで、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアル全体を通して、ドメインを次のように置き換えますexample.com
構成ファイルと例で。
ステップ1—Traefikの構成と実行
Traefikプロジェクトには公式Dockerイメージがあるため、これを使用してDockerコンテナーでTraefikを実行します。
ただし、Traefikコンテナを起動して実行する前に、構成ファイルを作成し、暗号化されたパスワードを設定して、監視ダッシュボードにアクセスできるようにする必要があります。
を使用します htpasswd
この暗号化されたパスワードを作成するユーティリティ。 まず、に含まれているユーティリティをインストールします apache2-utils
パッケージ:
- sudo apt-get install apache2-utils
次に、でパスワードを生成します htpasswd
. 代わりの secure_password
Traefik管理者ユーザーに使用するパスワードを使用して:
- htpasswd -nb admin secure_password
プログラムからの出力は次のようになります。
Outputadmin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/
Traefic構成ファイルでこの出力を使用して、Traefikヘルスチェックおよび監視ダッシュボードのHTTP基本認証を設定します。 後で貼り付けることができるように、出力行全体をコピーします。
Traefikサーバーを構成するために、という新しい構成ファイルを作成します。 traefik.toml
TOML形式を使用します。 TOML はINIファイルに似た構成言語ですが、標準化されています。 このファイルを使用すると、Traefikサーバーとさまざまな統合、または使用するプロバイダーを構成できます。 このチュートリアルでは、Traefikで利用可能な3つのプロバイダーを使用します。 web
, docker
、 と acme
、Let’sEncryptを使用してTLSをサポートするために使用されます。
- nano traefik.toml
まず、2つの名前付きエントリポイントを追加します。 http
と https
、すべてのバックエンドがデフォルトでアクセスできるようになります。
defaultEntryPoints = ["http", "https"]
構成します http
と https
このファイルの後半にあるエントリポイント。
次に、 web
ダッシュボードインターフェイスへのアクセスを提供するプロバイダー。 ここに、からの出力を貼り付けます htpasswd
指図:
...
[web]
address = ":8080"
[web.auth.basic]
users = ["admin:your_encrypted_password"]
ダッシュボードは、Traefikコンテナ内で実行される別個のWebアプリケーションです。 ダッシュボードをポートで実行するように設定しました 8080
.
The web.auth.basic
セクションでは、ダッシュボードのHTTP基本認証を構成します。 からの出力を使用します htpasswd
の値を求めて実行したコマンド users
エントリ。 追加のログインは、コンマで区切って指定できます。
次に、エントリポイントを定義します。 The entryPoints
セクションは、Traefikとプロキシされたコンテナがリッスンできるアドレスを設定します。 次の行をファイルに追加します。
...
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
The http
エントリポイントはポートを処理します 80
、 https
エントリポイントはポートを使用します 443
TLS/SSLの場合。 ポート上のすべてのトラフィックを自動的にリダイレクトします 80
に https
すべての要求に対して安全な接続を強制するためのエントリポイント。
最後に、このセクションを追加して、TraefikのLet’sEncrypt証明書のサポートを構成します。
...
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false
このセクションは acme
ACME は、Let’sEncryptと通信して証明書を管理するために使用されるプロトコルの名前であるためです。 Traefikにホストの証明書を生成させるために、 email
あなたのメールアドレスへの鍵。 次に、Let’sEncryptから受け取る情報を次のJSONファイルに保存するように指定します。 acme.json
. The entryPoint
キーはエントリポイント処理ポートを指す必要があります 443
、この場合は https
エントリーポイント。
最後の2つのキー、 onHostRule
と onDemand
、Traefikが証明書を生成する方法を指示します。 指定されたホスト名を持つコンテナが作成されたらすぐに証明書をフェッチしたいのですが、それが onHostRule
設定で十分です。 The onDemand
設定は、要求が最初に行われたときに証明書の生成を試みます。 これにより、最初のリクエストが遅くなり、訪問者に非常に目立つようになるため、これは避けます。
ファイルを保存して、エディターを終了します。 この構成がすべて整ったら、Traefikを起動できます。
ステップ2–Traefikコンテナを実行する
次に、プロキシがコンテナと共有するDockerネットワークを作成します。 Dockerネットワークは、DockerComposeを使用して実行されるアプリケーションで使用できるようにするために必要です。 このネットワークを呼びましょう proxy
.
- docker network create proxy
Traefikコンテナが起動したら、このネットワークに追加します。 次に、後でTraefikがプロキシするために、このネットワークにコンテナを追加できます。
次に、Let’sEncrypt情報を保持する空のファイルを作成します。 これをコンテナに共有して、Traefikが使用できるようにします。
- touch acme.json
Traefikは、コンテナ内のrootユーザーがこのファイルへの一意の読み取りおよび書き込みアクセス権を持っている場合にのみ、このファイルを使用できます。 これを行うには、上の権限をロックダウンします acme.json
ファイルの所有者のみが読み取りおよび書き込み権限を持つようにします。
- chmod 600 acme.json
ファイルがDockerに渡されると、所有者はコンテナ内のrootユーザーに自動的に変更されます。
最後に、次のコマンドを使用してTraefikコンテナを作成します。
- docker run -d \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v $PWD/traefik.toml:/traefik.toml \
- -v $PWD/acme.json:/acme.json \
- -p 80:80 \
- -p 443:443 \
- -l traefik.frontend.rule=Host:monitor.example.com \
- -l traefik.port=8080 \
- --network proxy \
- --name traefik \
- traefik:1.3.6-alpine --docker
コマンドは少し長いので、分解してみましょう。
を使用します -d
コンテナをデーモンとしてバックグラウンドで実行するためのフラグ。 次に、 docker.sock
Traefikプロセスがコンテナーへの変更をリッスンできるように、コンテナーにファイルします。 私達はまた共有します traefik.toml
構成ファイルと acme.json
コンテナに作成したファイル。
次に、ポートをマップします :80
と :443
DockerホストをTraefikコンテナの同じポートに接続して、TraefikがサーバーへのすべてのHTTPおよびHTTPSトラフィックを受信するようにします。
次に、トラフィックをホスト名に転送するようにTraefikに指示する2つのDockerラベルを設定します monitor.example.com
ポートへ :8080
Traefikコンテナ内で、監視ダッシュボードを公開します。
コンテナのネットワークを proxy
、コンテナに名前を付けます traefik
.
最後に、 traefik:1.3.6-alpine
このコンテナの画像は小さいので。
Dockerイメージの ENTRYPOINT
イメージからコンテナが作成されるときに常に実行されるコマンドです。 この場合、コマンドは traefik
コンテナ内のバイナリ。 コンテナを起動するときに、そのコマンドに追加の引数を渡すことができます。 私たちの場合、引数を渡します --docker
に ENTRYPOINT
これにより、 docker
プロバイダーはデフォルト設定で登録されています。 The docker
プロバイダーにより、TraefikはDockerコンテナーの前でプロキシとして機能できます。 Dockerプロバイダーのデフォルト構成は適切に機能するため、Dockerプロバイダーで構成する必要はありません。 traefik.toml
.
コンテナが起動すると、コンテナの状態を確認するためにアクセスできるダッシュボードができました。 このダッシュボードを使用して、Traefikが登録したフロントエンドとバックエンドを視覚化することもできます。 ブラウザで次の位置に移動して、監視ダッシュボードにアクセスします https://monitor.example.com
. ユーザー名とパスワードの入力を求められます。これらはadminであり、手順1で構成したパスワードです。
ログインすると、。 次のようなインターフェースが表示されます。
まだ見るものはあまりありませんが、このウィンドウを開いたままにしておくと、Traefikが使用するコンテナを追加すると、内容が変化するのがわかります。
これで、Traefikプロキシが実行され、Dockerと連携するように構成され、他のDockerコンテナーを監視する準備が整いました。 Traefikがプロキシとして機能するためのいくつかのコンテナを開始しましょう。
ステップ3—コンテナをTraefikに登録する
Traefikコンテナを実行すると、その背後でアプリケーションを実行する準備が整います。 Traefikの背後にある次のコンテナを起動しましょう。
- 公式Wordpress画像を使用したブログ。
- 公式管理者イメージを使用するデータベース管理サーバー。
Docker Composeを使用して、これらのアプリケーションの両方を管理します。 docker-compose.yml
ファイル:
- nano docker-compose.yml
次の行をファイルに追加して、使用するバージョンとネットワークを指定します。
version: "3"
networks:
proxy:
external: true
internal:
external: false
DockerComposeバージョンを使用します 3
これは、作成ファイル形式の最新のメジャーバージョンだからです。
Traefikがアプリケーションを認識するためには、それらが同じネットワークの一部である必要があります。ネットワークを手動で作成したため、次のネットワーク名を指定してネットワークをプルします。 proxy
と設定 external
に true
. 次に、公開されたコンテナを、Traefikを介して公開しないデータベースコンテナに接続できるように、別のネットワークを定義します。 このネットワークを呼びます internal
.
次に、それぞれを定義します services
、 一つずつ。 から始めましょう blog
コンテナ。これは、公式のWordPressイメージに基づいています。 この構成をファイルに追加します。
version: "3"
...
services:
blog:
image: wordpress:4.7.5-apache
environment:
WORDPRESS_DB_PASSWORD:
labels:
- traefik.backend=blog
- traefik.frontend.rule=Host:blog.example.com
- traefik.docker.network=proxy
- traefik.port=80
networks:
- internal
- proxy
depends_on:
- mysql
The environment
キーを使用すると、コンテナ内に設定される環境変数を指定できます。 の値を設定しないことによって WORDPRESS_DB_PASSWORD
、Docker Composeに、シェルから値を取得し、コンテナーを作成するときにそれを渡すように指示しています。 コンテナを起動する前に、シェルでこの環境変数を定義します。 このようにして、パスワードを構成ファイルにハードコーディングしません。
The labels
セクションでは、Traefikの構成値を指定します。 Dockerラベルはそれ自体では何もしませんが、Traefikはこれらを読み取るため、コンテナーの処理方法を認識しています。 これらの各ラベルの機能は次のとおりです。
traefik.backend
Traefikのバックエンドサービスの名前を指定します(これは実際のblog
容器)。traefik.frontend.rule=Host:blog.example.com
要求されたホストを調べ、それがのパターンと一致するかどうかをTraefikに指示しますblog.example.com
トラフィックをにルーティングする必要がありますblog
容器。traefik.docker.network=proxy
このコンテナの内部IPを見つけるためにTraefikを探すネットワークを指定します。 TraefikコンテナはすべてのDocker情報にアクセスできるため、internal
これを指定しなかった場合はネットワーク。traefik.port
Traefikがトラフィックをこのコンテナにルーティングするために使用する公開ポートを指定します。
この構成では、すべてのトラフィックがDockerホストのポートに送信されます 80
にルーティングされます blog
容器。
このコンテナを2つの異なるネットワークに割り当てて、Traefikが proxy
ネットワークとそれはを介してデータベースコンテナと通信することができます internal
通信網。
最後に、 depends_on
keyは、依存関係が実行された後にこのコンテナーを開始する必要があることをDockerComposeに通知します。 WordPressを実行するにはデータベースが必要なので、 mysql
開始する前のコンテナ blog
容器。
次に、次の構成をファイルに追加して、MySQLサービスを構成します。
services:
...
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
networks:
- internal
labels:
- traefik.enable=false
このコンテナには、公式のMySQL5.7イメージを使用しています。 もう一度使用していることに気付くでしょう environment
値のないアイテム。 The MYSQL_ROOT_PASSWORD
と WORDPRESS_DB_PASSWORD
WordPressコンテナがMySQLと通信できるようにするには、変数を同じ値に設定する必要があります。 公開したくない mysql
コンテナはTraefikまたは外の世界に割り当てられるため、このコンテナは internal
通信網。 TraefikはDockerソケットにアクセスできるため、プロセスは引き続き mysql
デフォルトではコンテナなので、ラベルを追加します traefik.enable=false
Traefikがこのコンテナを公開しないように指定します。
最後に、次の構成を追加して、Adminerコンテナーを定義します。
services:
...
adminer:
image: adminer:4.3.1-standalone
labels:
- traefik.backend=adminer
- traefik.frontend.rule=Host:db-admin.example.com
- traefik.docker.network=proxy
- traefik.port=8080
networks:
- internal
- proxy
depends_on:
- mysql
このコンテナは、公式のAdminerイメージに基づいています。 The network
と depends_on
このコンテナの構成は、私たちが使用しているものと完全に一致します blog
容器。
ただし、すべてのトラフィックをポートに転送しているため 80
Dockerホスト上で直接 blog
コンテナの場合、トラフィックが私たちのコンテナに到達するために、このコンテナを別の方法で構成する必要があります adminer
容器。 この線traefik.frontend.rule=Host:db-admin.example.com
要求されたホストを調べるようにTraefikに指示します。 のパターンと一致する場合 db-admin.example.com
Traefikはトラフィックをにルーティングします adminer
容器。
ファイルを保存して、テキストエディタを終了します。
次に、シェルに値を設定します WORDPRESS_DB_PASSWORD
と MYSQL_ROOT_PASSWORD
コンテナを開始する前の変数:
- export WORDPRESS_DB_PASSWORD=secure_database_password
- export MYSQL_ROOT_PASSWORD=secure_database_password
代わりの secure_database_password
ご希望のデータベースパスワードを使用してください。
これらの変数を設定して、を使用してコンテナを実行します docker-compose
:
- docker-compose up -d
次に、Traefik管理ダッシュボードをもう一度見てください。 あなたは今あることがわかります backend
と frontend
公開された2つのサーバーの場合:
案内する blog.example.com
、置換 example.com
あなたのドメインで。 TLS接続にリダイレクトされ、Wordpressのセットアップを完了することができます。
次に、にアクセスしてAdminerにアクセスします db-admin.example.com
あなたのブラウザで、再び置き換えます example.com
あなたのドメインで。 The mysql
コンテナは外界にさらされていませんが、 adminer
コンテナは、 internal
を使用して共有するDockerネットワーク mysql
ホスト名としてのコンテナ名。
管理者ログイン画面で、ユーザー名 root を使用し、 mysql
server の場合、設定した値を使用します MYSQL_ROOT_PASSWORD
パスワード用。 ログインすると、Adminerユーザーインターフェイスが表示されます。
現在、両方のサイトが機能しており、次の場所でダッシュボードを使用できます。 monitor.example.com
アプリケーションを監視します。
結論
このチュートリアルでは、Dockerコンテナー内の他のアプリケーションにリクエストをプロキシするようにTraefikを構成しました。
アプリケーションコンテナレベルでのTraefikの宣言型構成により、より多くのサービスを簡単に構成でき、再起動する必要はありません。 traefik
Traefikは監視しているDockerソケットファイルを介して変更にすぐに気付くため、プロキシトラフィックに新しいアプリケーションを追加するときのコンテナ。
Traefikで何ができるかについて詳しくは、Traefikの公式ドキュメントをご覧ください。