著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。

注:このチュートリアルはTraefikv1を対象としています。 Traefik v2をインストールして構成する場合は、この新しいチュートリアルを使用してください。

序章

Docker は、本番環境でWebアプリケーションを実行するための効率的な方法ですが、同じDockerホストで複数のアプリケーションを実行したい場合があります。 この状況では、ポートのみを公開する必要があるため、リバースプロキシを設定する必要があります 80443 世界の残りの部分に。

Traefik は、独自の監視ダッシュボードを含むDocker対応のリバースプロキシです。 このチュートリアルでは、Traefikを使用して、リクエストを2つの異なるWebアプリケーションコンテナにルーティングします。WordPressコンテナとAdminerコンテナで、それぞれMySQLと通信します。データベース。 Let’s Encrypt を使用して、HTTPS経由ですべてを提供するようにTraefikを構成します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • 1つのUbuntu18.04サーバーは、Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされます。 これには、sudoの非rootユーザーとファイアウォールが含まれます。
  • サーバーにDockerがインストールされています。これは、 Ubuntu18.04にDockerをインストールして使用する方法に従って実行できます。
  • Ubuntu18.04にDockerComposeをインストールする方法の手順に従ってインストールされたDockerCompose。
  • ドメインと3つのAレコード、 db-admin, blogmonitor、それぞれがサーバーのIPアドレスを指していること。 DigitalOceanのドメインとDNSドキュメントを読むことで、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアル全体を通して、ドメインを次のように置き換えます your_domain 構成ファイルと例で。

ステップ1—Traefikの構成と実行

Traefikプロジェクトには公式Dockerイメージがあるため、これを使用してDockerコンテナーでTraefikを実行します。

ただし、Traefikコンテナを起動して実行する前に、構成ファイルを作成し、暗号化されたパスワードを設定して、監視ダッシュボードにアクセスできるようにする必要があります。

を使用します htpasswd この暗号化されたパスワードを作成するユーティリティ。 まず、に含まれているユーティリティをインストールします apache2-utils パッケージ:

  1. sudo apt-get install apache2-utils

次に、でパスワードを生成します htpasswd. 代わりの secure_password Traefik管理者ユーザーに使用するパスワードを使用して:

  1. htpasswd -nb admin secure_password

プログラムからの出力は次のようになります。

Output
admin:$apr1$ruca84Hq$mbjdMZBAG.KWn7vfN/SNK/

Traefik構成ファイルでこの出力を使用して、Traefikヘルスチェックおよび監視ダッシュボードのHTTP基本認証を設定します。 後で貼り付けることができるように、出力行全体をコピーします。

Traefikサーバーを構成するために、という新しい構成ファイルを作成します。 traefik.toml TOML形式を使用します。 TOML は、INIファイルに似た構成言語ですが、標準化されています。 このファイルを使用すると、Traefikサーバーとさまざまな統合、または使用するプロバイダーを構成できます。 このチュートリアルでは、Traefikで利用可能な3つのプロバイダーを使用します。 api, docker、 と acme、Let’sEncryptを使用してTLSをサポートするために使用されます。

で新しいファイルを開きます nano またはお気に入りのテキストエディタ:

  1. nano traefik.toml

まず、2つの名前付きエントリポイントを追加します。 httphttps、すべてのバックエンドがデフォルトでアクセスできるようになります。

traefik.toml
defaultEntryPoints = ["http", "https"]

構成します httphttps このファイルの後半にあるエントリポイント。

次に、 api ダッシュボードインターフェイスへのアクセスを提供するプロバイダー。 ここに、からの出力を貼り付けます htpasswd 指図:

traefik.toml
...
[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["admin:your_encrypted_password"]

[api]
entrypoint="dashboard"

ダッシュボードは、Traefikコンテナ内で実行される別個のWebアプリケーションです。 ダッシュボードをポートで実行するように設定しました 8080.

The entrypoints.dashboard セクションは、との接続方法を構成します api プロバイダー、および entrypoints.dashboard.auth.basic セクションでは、ダッシュボードのHTTP基本認証を構成します。 からの出力を使用します htpasswd の値を求めて実行したコマンド users エントリ。 追加のログインは、コンマで区切って指定できます。

最初に定義しました entryPoint、ただし、に向けられていない標準のHTTPおよびHTTPS通信用に他のものを定義する必要があります api プロバイダー。 The entryPoints セクションは、Traefikとプロキシされたコンテナがリッスンできるアドレスを設定します。 これらの行をファイルの下に追加します entryPoints 見出し:

traefik.toml
...
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]
...

The http エントリポイントはポートを処理します 80https エントリポイントはポートを使用します 443 TLS/SSLの場合。 ポート上のすべてのトラフィックを自動的にリダイレクトします 80https すべての要求に対して安全な接続を強制するためのエントリポイント。

次に、このセクションを追加して、TraefikのLet’sEncrypt証明書のサポートを構成します。

traefik.toml
...
[acme]
email = "your_email@your_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

このセクションは acme ACME は、Let’sEncryptと通信して証明書を管理するために使用されるプロトコルの名前であるためです。 Let’s Encryptサービスでは、有効な電子メールアドレスで登録する必要があるため、Traefikにホストの証明書を生成させるには、 email あなたのメールアドレスへの鍵。 次に、Let’sEncryptから受け取る情報を次のJSONファイルに保存するように指定します。 acme.json. The entryPoint キーはエントリポイント処理ポートを指す必要があります 443、この場合は https エントリーポイント。

キー onHostRule Traefikが証明書の生成をどのように行うかを指示します。 指定されたホスト名を持つコンテナが作成されたらすぐに証明書をフェッチしたいのですが、それが onHostRule 設定で十分です。

The acme.httpChallenge このセクションでは、Let’sEncryptが証明書を生成する必要があることを確認する方法を指定できます。 チャレンジの一部としてファイルを提供するように構成しています。 http エントリーポイント。

最後に、 docker これらの行をファイルに追加することにより、プロバイダー:

traefik.toml
...
[docker]
domain = "your_domain"
watch = true
network = "web"

The docker プロバイダーにより、TraefikはDockerコンテナーの前でプロキシとして機能できます。 プロバイダーを次のように構成しました watch 上の新しいコンテナの場合 web ネットワーク(まもなく作成します)をサブドメインとして公開します your_domain.

この時点で、 traefik.toml 次の内容が必要です。

traefik.toml
defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["admin:your_encrypted_password"]
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

[api]
entrypoint="dashboard"

[acme]
email = "your_email@your_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

[docker]
domain = "your_domain"
watch = true
network = "web"

ファイルを保存して、エディターを終了します。 この構成がすべて整ったら、Traefikを起動できます。

ステップ2—Traefikコンテナを実行する

次に、プロキシがコンテナと共有するDockerネットワークを作成します。 Dockerネットワークは、DockerComposeを使用して実行されるアプリケーションで使用できるようにするために必要です。 このネットワークを呼びましょう web.

  1. docker network create web

Traefikコンテナが起動したら、このネットワークに追加します。 次に、後でTraefikがプロキシするために、このネットワークにコンテナを追加できます。

次に、Let’sEncrypt情報を保持する空のファイルを作成します。 これをコンテナに共有して、Traefikが使用できるようにします。

  1. touch acme.json

Traefikは、コンテナ内のrootユーザーがこのファイルへの一意の読み取りおよび書き込みアクセス権を持っている場合にのみ、このファイルを使用できます。 これを行うには、上の権限をロックダウンします acme.json ファイルの所有者のみが読み取りおよび書き込み権限を持つようにします。

  1. chmod 600 acme.json

ファイルがDockerに渡されると、所有者はコンテナ内のrootユーザーに自動的に変更されます。

最後に、次のコマンドを使用してTraefikコンテナを作成します。

  1. docker run -d \
  2. -v /var/run/docker.sock:/var/run/docker.sock \
  3. -v $PWD/traefik.toml:/traefik.toml \
  4. -v $PWD/acme.json:/acme.json \
  5. -p 80:80 \
  6. -p 443:443 \
  7. -l traefik.frontend.rule=Host:monitor.your_domain \
  8. -l traefik.port=8080 \
  9. --network web \
  10. --name traefik \
  11. traefik:1.7-alpine

コマンドは少し長いので、分解してみましょう。

を使用します -d コンテナをデーモンとしてバックグラウンドで実行するためのフラグ。 次に、 docker.sock Traefikプロセスがコンテナーへの変更をリッスンできるように、コンテナーにファイルします。 私達はまた共有します traefik.toml 構成ファイルと acme.json コンテナに作成したファイル。

次に、ポートをマップします :80:443 DockerホストをTraefikコンテナの同じポートに接続して、TraefikがサーバーへのすべてのHTTPおよびHTTPSトラフィックを受信するようにします。

次に、トラフィックをホスト名に転送するようにTraefikに指示する2つのDockerラベルを設定します monitor.your_domain ポートへ :8080 Traefikコンテナ内で、監視ダッシュボードを公開します。

コンテナのネットワークを web、コンテナに名前を付けます traefik.

最後に、 traefik:1.7-alpine このコンテナの画像は小さいので。

Dockerイメージの ENTRYPOINT イメージからコンテナが作成されるときに常に実行されるコマンドです。 この場合、コマンドは traefik コンテナ内のバイナリ。 コンテナを起動するときにそのコマンドに追加の引数を渡すことができますが、すべての設定は traefik.toml ファイル。

コンテナが起動すると、コンテナの状態を確認するためにアクセスできるダッシュボードができました。 このダッシュボードを使用して、Traefikが登録したフロントエンドとバックエンドを視覚化することもできます。 ブラウザで次の位置に移動して、監視ダッシュボードにアクセスします https://monitor.your_domain. ユーザー名とパスワードの入力を求められます。これらはadminであり、手順1で構成したパスワードです。

ログインすると、次のようなインターフェースが表示されます。

まだ見るものはあまりありませんが、このウィンドウを開いたままにしておくと、Traefikが使用するコンテナを追加すると、内容が変化するのがわかります。

これで、Traefikプロキシが実行され、Dockerと連携するように構成され、他のDockerコンテナーを監視する準備が整いました。 Traefikがプロキシとして機能するためのいくつかのコンテナを開始しましょう。

ステップ3—コンテナをTraefikに登録する

Traefikコンテナを実行すると、その背後でアプリケーションを実行する準備が整います。 Traefikの背後にある次のコンテナを起動しましょう。

  1. 公式Wordpress画像を使用したブログ。
  2. 公式管理者イメージを使用するデータベース管理サーバー。

Docker Composeを使用して、これらのアプリケーションの両方を管理します。 docker-compose.yml ファイル。 を開きます docker-compose.yml エディター内のファイル:

  1. nano docker-compose.yml

次の行をファイルに追加して、使用するバージョンとネットワークを指定します。

docker-compose.yml
version: "3"

networks:
  web:
    external: true
  internal:
    external: false

DockerComposeバージョンを使用します 3 これは、作成ファイル形式の最新のメジャーバージョンだからです。

Traefikがアプリケーションを認識するためには、それらが同じネットワークの一部である必要があります。ネットワークを手動で作成したため、次のネットワーク名を指定してネットワークをプルします。 web と設定 externaltrue. 次に、公開されたコンテナを、Traefikを介して公開しないデータベースコンテナに接続できるように、別のネットワークを定義します。 このネットワークを呼びます internal.

次に、それぞれを定義します services、 一つずつ。 から始めましょう blog コンテナ。これは、公式のWordPressイメージに基づいています。 この構成をファイルに追加します。

docker-compose.yml
version: "3"
...

services:
  blog:
    image: wordpress:4.9.8-apache
    environment:
      WORDPRESS_DB_PASSWORD:
    labels:
      - traefik.backend=blog
      - traefik.frontend.rule=Host:blog.your_domain
      - traefik.docker.network=web
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql

The environment キーを使用すると、コンテナ内に設定される環境変数を指定できます。 の値を設定しないことによって WORDPRESS_DB_PASSWORD、Docker Composeに、シェルから値を取得し、コンテナーを作成するときにそれを渡すように指示しています。 コンテナを起動する前に、シェルでこの環境変数を定義します。 このようにして、パスワードを構成ファイルにハードコーディングしません。

The labels セクションでは、Traefikの構成値を指定します。 Dockerラベルはそれ自体では何もしませんが、Traefikはこれらを読み取るため、コンテナーの処理方法を認識しています。 これらの各ラベルの機能は次のとおりです。

  • traefik.backend Traefikのバックエンドサービスの名前を指定します(これは実際の blog 容器)。
  • traefik.frontend.rule=Host:blog.your_domain 要求されたホストを調べ、それがのパターンと一致するかどうかをTraefikに指示します blog.your_domain トラフィックをにルーティングする必要があります blog 容器。
  • traefik.docker.network=web このコンテナの内部IPを見つけるためにTraefikを探すネットワークを指定します。 TraefikコンテナはすべてのDocker情報にアクセスできるため、 internal これを指定しなかった場合はネットワーク。
  • traefik.port Traefikがトラフィックをこのコンテナにルーティングするために使用する公開ポートを指定します。

この構成では、すべてのトラフィックがDockerホストのポートに送信されます 80 にルーティングされます blog 容器。

このコンテナを2つの異なるネットワークに割り当てて、Traefikが web ネットワークとそれはを介してデータベースコンテナと通信することができます internal 通信網。

最後に、 depends_on keyは、依存関係が実行された後にこのコンテナーを開始する必要があることをDockerComposeに通知します。 WordPressを実行するにはデータベースが必要なので、 mysql 開始する前のコンテナ blog 容器。

次に、次の構成をファイルに追加して、MySQLサービスを構成します。

docker-compose.yml
services:
...
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD:
    networks:
      - internal
    labels:
      - traefik.enable=false

このコンテナには、公式のMySQL5.7イメージを使用しています。 もう一度使用していることに気付くでしょう environment 値のないアイテム。 The MYSQL_ROOT_PASSWORDWORDPRESS_DB_PASSWORD WordPressコンテナがMySQLと通信できるようにするには、変数を同じ値に設定する必要があります。 公開したくない mysql コンテナはTraefikまたは外の世界に割り当てられるため、このコンテナは internal 通信網。 TraefikはDockerソケットにアクセスできるため、プロセスは引き続き mysql デフォルトではコンテナなので、ラベルを追加します traefik.enable=false Traefikがこのコンテナを公開しないように指定します。

最後に、次の構成を追加して、Adminerコンテナーを定義します。

docker-compose.yml
services:
...
  adminer:
    image: adminer:4.6.3-standalone
    labels:
      - traefik.backend=adminer
      - traefik.frontend.rule=Host:db-admin.your_domain
      - traefik.docker.network=web
      - traefik.port=8080
    networks:
      - internal
      - web
    depends_on:
      - mysql

このコンテナは、公式のAdminerイメージに基づいています。 The networkdepends_on このコンテナの構成は、私たちが使用しているものと完全に一致します blog 容器。

ただし、すべてのトラフィックをポートに転送しているため 80 Dockerホスト上で直接 blog コンテナの場合、トラフィックが私たちのコンテナに到達するために、このコンテナを別の方法で構成する必要があります adminer 容器。 この線 traefik.frontend.rule=Host:db-admin.your_domain 要求されたホストを調べるようにTraefikに指示します。 のパターンと一致する場合 db-admin.your_domain、Traefikはトラフィックをにルーティングします adminer 容器。

この時点で、 docker-compose.yml 次の内容が必要です。

docker-compose.yml
version: "3"

networks:
  web:
    external: true
  internal:
    external: false

services:
  blog:
    image: wordpress:4.9.8-apache
    environment:
      WORDPRESS_DB_PASSWORD:
    labels:
      - traefik.backend=blog
      - traefik.frontend.rule=Host:blog.your_domain
      - traefik.docker.network=web
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD:
    networks:
      - internal
    labels:
      - traefik.enable=false
  adminer:
    image: adminer:4.6.3-standalone
    labels:
      - traefik.backend=adminer
      - traefik.frontend.rule=Host:db-admin.your_domain
      - traefik.docker.network=web
      - traefik.port=8080
    networks:
      - internal
      - web
    depends_on:
      - mysql

ファイルを保存して、テキストエディタを終了します。

次に、シェルに値を設定します WORDPRESS_DB_PASSWORDMYSQL_ROOT_PASSWORD コンテナを開始する前の変数:

  1. export WORDPRESS_DB_PASSWORD=secure_database_password
  2. export MYSQL_ROOT_PASSWORD=secure_database_password

代わりの secure_database_password ご希望のデータベースパスワードを使用してください。 両方に同じパスワードを使用することを忘れないでください WORDPRESS_DB_PASSWORDMYSQL_ROOT_PASSWORD.

これらの変数を設定して、を使用してコンテナを実行します docker-compose:

  1. docker-compose up -d

次に、Traefik管理ダッシュボードをもう一度見てください。 あなたは今あることがわかります backendfrontend 公開された2つのサーバーの場合:

案内する blog.your_domain、置換 your_domain あなたのドメインで。 TLS接続にリダイレクトされ、Wordpressのセットアップを完了することができます。

次に、にアクセスしてAdminerにアクセスします db-admin.your_domain あなたのブラウザで、再び置き換えます your_domain あなたのドメインで。 The mysql コンテナは外界にさらされていませんが、 adminer コンテナは、 internal を使用して共有するDockerネットワーク mysql ホスト名としてのコンテナ名。

管理者ログイン画面で、ユーザー名 root を使用し、 mysql server の場合、設定した値を使用します MYSQL_ROOT_PASSWORD パスワード用。 ログインすると、Adminerユーザーインターフェイスが表示されます。

現在、両方のサイトが機能しており、次の場所でダッシュボードを使用できます。 monitor.your_domain アプリケーションを監視します。

結論

このチュートリアルでは、Dockerコンテナー内の他のアプリケーションにリクエストをプロキシするようにTraefikを構成しました。

アプリケーションコンテナレベルでのTraefikの宣言型構成により、より多くのサービスを簡単に構成でき、再起動する必要はありません。 traefik Traefikは監視しているDockerソケットファイルを介して変更にすぐに気付くため、プロキシトラフィックに新しいアプリケーションを追加するときのコンテナ。

Traefikで何ができるかについて詳しくは、Traefikの公式ドキュメントをご覧ください。