前書き
Dockerは、本番環境でWebアプリケーションを実行するための効率的な方法ですが、同じDockerホストで複数のアプリケーションを実行したい場合があります。 この状況では、ポート80
と443
のみを他の世界に公開する必要があるため、リバースプロキシを設定する必要があります。
Traefikは、独自の監視ダッシュボードを含むDocker対応のリバースプロキシです。 このチュートリアルでは、Traefikを使用して、リクエストを2つの異なるWebアプリケーションコンテナ(WordpressコンテナとAdminerコンテナ)にルーティングし、それぞれがMySQLデータベースと通信します。 Let’s Encryptを使用してHTTPS経由ですべてを提供するようにTraefikを構成します。
前提条件
このチュートリアルを進めるには、次のものが必要です。
-
sudo非rootユーザーとファイアウォールを含むthe Ubuntu 16.04 initial server setup guideをフォローしてセットアップされた1つのUbuntu16.04サーバー。
-
サーバーにDockerがインストールされています。これは、How to Install and Use Docker on Ubuntu 16.04に従って実行できます。
-
How to Install Docker Compose on Ubuntu 16.04からの指示とともにインストールされたDockerCompose。
-
ドメインと3つのAレコード、
db-admin
、blog
、およびmonitor
。それぞれがサーバーのIPアドレスを指します。 DigitalOceanのDomains and DNS documentationを読むことで、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアル全体を通して、構成ファイルと例のexample.com
をドメインに置き換えてください。
[[step-1 -—- configuring-and-running-traefik]] ==ステップ1—Traefikの構成と実行
Traefikプロジェクトにはofficial Docker imageがあるため、これを使用して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構成ファイルでこの出力を使用して、Trafikヘルスチェックおよび監視ダッシュボードのHTTP基本認証を設定します。 後で貼り付けることができるように、出力行全体をコピーします。
Traefikサーバーを構成するために、TOML形式を使用してtraefik.toml
という新しい構成ファイルを作成します。 TOMLはINIファイルに似た構成言語ですが、標準化されています。 このファイルを使用すると、Traefikサーバーと、使用するさまざまな統合(providers)を構成できます。 このチュートリアルでは、Traefikで利用可能な3つのプロバイダー(web
、docker
、およびacme
)を使用します。これらは、Let’sEncryptを使用してTLSをサポートするために使用されます。
nano traefik.toml
まず、すべてのバックエンドがデフォルトでアクセスできる2つの名前付きエントリポイントhttp+`and `+https
を追加します。
traefik.toml
defaultEntryPoints = ["http", "https"]
このファイルの後半で、http
およびhttps
エントリポイントを構成します。
次に、ダッシュボードインターフェイスへのアクセスを提供するweb
プロバイダーを構成します。 ここに、htpasswd
コマンドからの出力を貼り付けます。
traefik.toml
...
[web]
address = ":8080"
[web.auth.basic]
users = ["admin:your_encrypted_password"]
ダッシュボードは、Traefikコンテナ内で実行される別個のWebアプリケーションです。 ダッシュボードをポート8080
で実行するように設定しました。
web.auth.basic
セクションは、ダッシュボードのHTTP基本認証を構成します。 実行したばかりのhtpasswd
コマンドからの出力をusers
エントリの値に使用します。 カンマで区切って追加のログインを指定できます。
次に、エントリポイントを定義します。 entryPoints
セクションは、Traefikとプロキシされたコンテナがリッスンできるアドレスを構成します。 これらの行をファイルに追加します。
traefik.toml
...
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
http
エントリポイントはポート80
を処理し、https
エントリポイントはTLS / SSLにポート443
を使用します。 ポート80
のすべてのトラフィックをhttps
のエントリポイントに自動的にリダイレクトして、すべての要求に対して安全な接続を強制します。
最後に、このセクションを追加して、Traefikの証明書の暗号化サポートを設定します。
traefik.toml
...
[acme]
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false
ACMEは、Let’s Encryptと通信して証明書を管理するために使用されるプロトコルの名前であるため、このセクションはacme
と呼ばれます。 Traefikにホストの証明書を生成させるために、email
キーを電子メールアドレスに設定します。 次に、Let’s Encryptから受け取る情報をacme.json
というJSONファイルに保存するように指定します。 entryPoint
キーは、ポート443
を処理するエントリポイントを指す必要があります。この場合は、https
エントリポイントです。
最後の2つのキー、onHostRule
とonDemand
は、Traefikが証明書を生成する方法を指示します。 指定されたホスト名を持つコンテナが作成されたらすぐに証明書をフェッチする必要があります。これは、onHostRule
設定が行うことです。 onDemand
設定は、最初に要求が行われたときに証明書の生成を試みます。 これにより、最初のリクエストが遅くなり、訪問者にとって非常に目立つようになるため、それは避けます。
ファイルを保存し、エディターを終了します。 このすべての構成が整ったら、Traefikを起動できます。
[[step-2 -–- running-the-traefik-container]] ==ステップ2–Traefikコンテナの実行
次に、プロキシがコンテナと共有するためのDockerネットワークを作成します。 Dockerネットワークは、Docker Composeを使用して実行されるアプリケーションで使用できるようにするために必要です。 このネットワークをproxy
と呼びましょう。
docker network create proxy
Traefikコンテナが起動したら、このネットワークに追加します。 その後、Traefikがプロキシするために、このネットワークに後でコンテナを追加できます。
次に、Let’s Encrypt情報を保持する空のファイルを作成します。 これをコンテナに共有して、Traefikが使用できるようにします。
touch acme.json
Traefikは、コンテナ内のルートユーザーに一意の読み取りおよび書き込みアクセス権がある場合にのみ、このファイルを使用できます。 これを行うには、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
ファイルをコンテナーに共有します。
次に、Dockerホストのポート:80
と:443
をTraefikコンテナー内の同じポートにマップして、TraefikがサーバーへのすべてのHTTPおよびHTTPSトラフィックを受信するようにします。
次に、トラフィックをホスト名monitor.example.com
からTraefikコンテナ内のポート:8080
に転送するように、Traefikに指示する2つのDockerラベルを設定し、監視ダッシュボードを公開します。
コンテナのネットワークをproxy
に設定し、コンテナにtraefik
という名前を付けます。
最後に、このコンテナは小さいため、traefik:1.3.6-alpine
イメージを使用します。
DockerイメージのENTRYPOINT
は、イメージからコンテナーが作成されるときに常に実行されるコマンドです。 この場合、コマンドはコンテナ内のtraefik
バイナリです。 コンテナを起動するときに、そのコマンドに追加の引数を渡すことができます。 この場合、引数--docker
をENTRYPOINT
に渡します。これにより、docker
プロバイダーがデフォルト設定で登録されます。 docker
プロバイダーにより、TraefikはDockerコンテナーの前でプロキシとして機能できます。 Dockerプロバイダーのデフォルト構成は適切に機能するため、traefik.toml
で構成する必要はありません。
コンテナが起動すると、ダッシュボードにアクセスして、コンテナの状態を確認できます。 このダッシュボードを使用して、Traefikが登録したフロントエンドとバックエンドを視覚化することもできます。 ブラウザでhttps://monitor.example.com
を指定して、監視ダッシュボードにアクセスします。 ユーザー名とパスワードの入力を求められます。これらはadminであり、手順1で構成したパスワードです。
ログインすると、。 次のようなインターフェースが表示されます。
まだあまり見ることはありませんが、このウィンドウを開いたままにしておくと、Traefikが操作するコンテナを追加すると内容が変更されます。
これで、Trafikプロキシが実行され、Dockerと連携するように構成され、他のDockerコンテナーを監視する準備が整いました。 Traefikのプロキシとして機能するコンテナをいくつか始めましょう。
[[step-3 -—- registering-containers-with-traefik]] ==ステップ3—コンテナをTraefikに登録する
Traefikコンテナを実行すると、その背後でアプリケーションを実行する準備が整います。 Traefikの背後にある次のコテナーを起動しましょう。
-
official Wordpress imageを使用したブログ。
-
official Adminer imageを使用するデータベース管理サーバー。
docker-compose.yml
ファイルを使用してDockerComposeでこれらのアプリケーションの両方を管理します。
nano docker-compose.yml
ファイルに次の行を追加して、使用するバージョンとネットワークを指定します。
docker-compose.yml
version: "3"
networks:
proxy:
external: true
internal:
external: false
Docker Composeバージョン3
は、Composeファイル形式の最新のメジャーバージョンであるため、使用しています。
Traefikがアプリケーションを認識するためには、それらが同じネットワークの一部である必要があります。ネットワークを手動で作成したため、proxy
のネットワーク名を指定し、external
をtrue
に設定してネットワークをプルします。 )s。 次に、公開されたコンテナをTraefikを介して公開しないデータベースコンテナに接続できるように、別のネットワークを定義します。 このネットワークをinternal
と呼びます。
次に、各services
を一度に1つずつ定義します。 公式のWordPressイメージに基づいたblog
コンテナから始めましょう。 この構成をファイルに追加します。
docker-compose.yml
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
environment
キーを使用すると、コンテナ内に設定される環境変数を指定できます。 WORDPRESS_DB_PASSWORD
に値を設定しないことで、Docker Composeにシェルから値を取得し、コンテナーを作成するときにそれを渡すように指示しています。 コンテナを起動する前に、シェルでこの環境変数を定義します。 このように、パスワードを構成ファイルにハードコーディングしません。
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
ネットワークのIPが必要になる可能性があります。 -
traefik.port
は、Traefikがトラフィックをこのコンテナにルーティングするために使用する公開ポートを指定します。
この構成では、Dockerホストのポート80
に送信されるすべてのトラフィックは、blog
コンテナーにルーティングされます。
このコンテナを2つの異なるネットワークに割り当てて、Traefikがproxy
ネットワーク経由でコンテナを見つけ、internal
ネットワーク経由でデータベースコンテナと通信できるようにします。
最後に、depends_on
キーは、このコンテナーが依存関係が実行されているafterを開始する必要があることをDockerComposeに通知します。 WordPressを実行するにはデータベースが必要なため、blog
コンテナーを開始する前に、mysql
コンテナーを実行する必要があります。
次に、この構成をファイルに追加して、MySQLサービスを構成します。
docker-compose.yml
services:
...
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:
networks:
- internal
labels:
- traefik.enable=false
このコンテナには、公式のMySQL 5.7イメージを使用しています。 値のないenvironment
アイテムを再び使用していることに気付くでしょう。 WordPressコンテナがMySQLと通信できるようにするには、MYSQL_ROOT_PASSWORD
変数とWORDPRESS_DB_PASSWORD
変数を同じ値に設定する必要があります。 mysql
コンテナをTraefikまたは外部に公開したくないので、このコンテナをinternal
ネットワークに割り当てるだけです。 TraefikはDockerソケットにアクセスできるため、プロセスはデフォルトでmysql
コンテナーのフロントエンドを公開します。そのため、ラベルtraefik.enable=false
を追加して、Traefikがこのコンテナーを公開しないように指定します。
最後に、この構成を追加してAdminerコンテナーを定義します。
docker-compose.yml
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
このコンテナは、公式の管理者イメージに基づいています。 このコンテナのnetwork
およびdepends_on
構成は、blog
コンテナに使用しているものと完全に一致します。
ただし、Dockerホストのポート80
へのすべてのトラフィックを直接blog
コンテナーに転送しているため、トラフィックがblog
に到達するようにするには、このコンテナーを別の方法で構成する必要があります。 t2)sコンテナ。 行 `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管理ダッシュボードをもう一度見てみましょう。 公開された2つのサーバーにbackend
とfrontend
があることがわかります。
blog.example.com
に移動し、example.com
をドメインに置き換えます。 TLS接続にリダイレクトされ、Wordpressのセットアップを完了することができます。
次に、ブラウザでdb-admin.example.com
にアクセスし、ドメインをexample.com
に置き換えて、Adminerにアクセスします。 mysql
コンテナは外部に公開されていませんが、adminer
コンテナは、mysql
コンテナ名を使用して共有するinternal
Dockerネットワークを介してアクセスできます。ホスト名。
管理者ログイン画面で、ユーザー名rootを使用し、serverにmysql
を使用し、パスワードにMYSQL_ROOT_PASSWORD
に設定した値を使用します。 ログインすると、管理者のユーザーインターフェースが表示されます。
現在、両方のサイトが機能しており、monitor.example.com
のダッシュボードを使用して、アプリケーションを監視できます。
結論
このチュートリアルでは、Dockerコンテナ内の他のアプリケーションへのリクエストをプロキシするようにTraefikを設定しました。
アプリケーションコンテナレベルでのTraefikの宣言型構成により、より多くのサービスを簡単に構成できます。TraefikはDockerソケットファイルを介して変更にすぐに気付くため、プロキシトラフィックに新しいアプリケーションを追加するときにtraefik
コンテナを再起動する必要はありません。モニタリング。
Traefikで何ができるかについて詳しくは、公式のTraefik documentationにアクセスしてください。