Ubuntu18.04でDockerコンテナのリバースプロキシとしてTraefikを使用する方法
著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。
注:このチュートリアルはTraefikv1を対象としています。 Traefik v2をインストールして構成する場合は、この新しいチュートリアルを使用してください。
序章
Docker は、本番環境でWebアプリケーションを実行するための効率的な方法ですが、同じDockerホストで複数のアプリケーションを実行したい場合があります。 この状況では、ポート80
と443
のみを他の世界に公開する必要があるため、リバースプロキシを設定する必要があります。
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
、blog
、monitor
で、それぞれがサーバーのIPアドレスを指します。 DigitalOceanのドメインとDNSドキュメントを読むことで、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアル全体を通して、構成ファイルと例でyour_domain
をドメインに置き換えてください。
ステップ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/
この出力をTraefik構成ファイルで使用して、Traefikヘルスチェックおよび監視ダッシュボードのHTTP基本認証を設定します。 後で貼り付けることができるように、出力行全体をコピーします。
Traefikサーバーを構成するには、TOML形式を使用してtraefik.toml
という新しい構成ファイルを作成します。 TOML は、INIファイルに似た構成言語ですが、標準化されています。 このファイルを使用すると、Traefikサーバーとさまざまな統合、または使用するプロバイダーを構成できます。 このチュートリアルでは、Traefikで利用可能な3つのプロバイダー[api
、docker
、およびacme
)を使用します。これらは、Let’sEncryptを使用してTLSをサポートするために使用されます。
nano
またはお気に入りのテキストエディタで新しいファイルを開きます。
- nano traefik.toml
まず、すべてのバックエンドがデフォルトでアクセスできる2つの名前付きエントリポイントhttp
とhttps
を追加します。
defaultEntryPoints = ["http", "https"]
このファイルの後半で、http
およびhttps
エントリポイントを構成します。
次に、api
プロバイダーを構成します。これにより、ダッシュボードインターフェイスにアクセスできるようになります。 ここに、htpasswd
コマンドからの出力を貼り付けます。
...
[entryPoints]
[entryPoints.dashboard]
address = ":8080"
[entryPoints.dashboard.auth]
[entryPoints.dashboard.auth.basic]
users = ["admin:your_encrypted_password"]
[api]
entrypoint="dashboard"
ダッシュボードは、Traefikコンテナ内で実行される別個のWebアプリケーションです。 ダッシュボードをポート8080
で実行するように設定しました。
entrypoints.dashboard
セクションは、api
プロバイダーとの接続方法を構成し、entrypoints.dashboard.auth.basic
セクションは、ダッシュボードのHTTP基本認証を構成します。 実行したhtpasswd
コマンドからの出力を、users
エントリの値に使用します。 追加のログインは、コンマで区切って指定できます。
最初のentryPoint
を定義しましたが、api
プロバイダーに向けられていない標準のHTTPおよびHTTPS通信用に他のものを定義する必要があります。 entryPoints
セクションは、Traefikとプロキシされたコンテナーがリッスンできるアドレスを構成します。 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のLet’sEncrypt証明書のサポートを構成します。
...
[acme]
email = "your_email@your_domain"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
ACME は、Let’s Encryptと通信して証明書を管理するために使用されるプロトコルの名前であるため、このセクションはacme
と呼ばれます。 Let’s Encryptサービスでは、有効な電子メールアドレスで登録する必要があるため、Traefikにホストの証明書を生成させるには、email
キーを電子メールアドレスに設定します。 次に、Let’sEncryptから受け取る情報をacme.json
というJSONファイルに保存するように指定します。 entryPoint
キーは、エントリポイント処理ポート443
(この場合はhttps
エントリポイント)を指す必要があります。
キーonHostRule
は、Traefikが証明書を生成する方法を指示します。 指定されたホスト名を持つコンテナーが作成されたらすぐに証明書をフェッチする必要があります。これにより、onHostRule
設定が実行されます。
acme.httpChallenge
セクションでは、Let’sEncryptが証明書を生成する必要があることを確認する方法を指定できます。 http
エントリポイントを介したチャレンジの一部としてファイルを提供するように構成しています。
最後に、次の行をファイルに追加して、docker
プロバイダーを構成しましょう。
...
[docker]
domain = "your_domain"
watch = true
network = "web"
docker
プロバイダーにより、TraefikはDockerコンテナーの前でプロキシとして機能できます。 web
ネットワーク(まもなく作成されます)上の新しいコンテナー用にプロバイダーをwatch
に構成し、それらをyour_domain
のサブドメインとして公開しました。
この時点で、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
と呼びましょう。
- docker network create web
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.your_domain \
- -l traefik.port=8080 \
- --network web \
- --name traefik \
- traefik:1.7-alpine
コマンドは少し長いので、分解してみましょう。
-d
フラグを使用して、コンテナーをデーモンとしてバックグラウンドで実行します。 次に、docker.sock
ファイルをコンテナーに共有して、Traefikプロセスがコンテナーへの変更をリッスンできるようにします。 また、コンテナに作成したtraefik.toml
構成ファイルとacme.json
ファイルを共有します。
次に、Dockerホストのポート:80
と:443
をTraefikコンテナー内の同じポートにマップして、TraefikがサーバーへのすべてのHTTPおよびHTTPSトラフィックを受信するようにします。
次に、トラフィックをホスト名monitor.your_domain
からポート:8080
に転送するようにTraefikに指示する2つのDockerラベルを設定し、監視ダッシュボードを公開します。
コンテナのネットワークを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の背後にある次のコンテナを起動しましょう。
- 公式Wordpress画像を使用したブログ。
- 公式管理者イメージを使用するデータベース管理サーバー。
docker-compose.yml
ファイルを使用して、DockerComposeでこれらのアプリケーションの両方を管理します。 エディタでdocker-compose.yml
ファイルを開きます。
- nano docker-compose.yml
次の行をファイルに追加して、使用するバージョンとネットワークを指定します。
version: "3"
networks:
web:
external: true
internal:
external: false
DockerComposeバージョン3
は、Composeファイル形式の最新のメジャーバージョンであるため、使用しています。
Traefikがアプリケーションを認識するためには、それらが同じネットワークの一部である必要があります。ネットワークは手動で作成したため、web
のネットワーク名を指定し、external
を[ X208X]