ウェブサイト検索

DockerでCaddyウェブサーバーをデプロイする方法


Caddyは高性能とメモリ安全性を考慮して設計された人気のあるモダンなウェブサーバーです。Goで書かれており、依存関係なしで動作し、Markdownによる静的サイトのレンダリングをサポートし、自動HTTPSを提供します。

Caddyは、デフォルトで便利な機能を提供するシンプルなサーバー管理エクスペリエンスを提供することに重点を置いています。ApacheやNGINXなどの競合システムよりも構成や維持が簡単になることがあります。この記事では、公式のCaddyイメージを使用して、最小限のセットアップで独自のサーバーを実行する方法を示します。

画像タグを選択する

Caddyの画像はいくつかの異なるバージョンがあります。執筆時点での最新バージョンはv2.4で、全員が共有しています。あなたは使用することができます

2.4.x

(置き換える)

x

特定のパッチバージョンを使用して、

2.4

、または

2

メジャー、マイナー、またはパッチコンポーネントにピン留めするため。

CaddyはLinuxとWindowsのDockerホストで動作します。現在のオペレーティングシステムの選択肢には、Alpine Linux、Windows Server Core 1809、およびWindows Server Core 2016 LTSCリリースがあります。

caddy:2

プラットフォームに適した画像を選択します; バリエーションとして次のようなものを使用できます

2.4-alpine

または

2.4.6-windowsservercore-1809

代わりに、より明確にするために。

基本的なサーバーの開始

Caddy は実行可能な構成で出荷されます。Docker イメージは、/usr/share/caddy ディレクトリからウェブコンテンツを提供します。このパスにホストディレクトリをマウントすることによって、ファイルをコンテナに追加できます。

Caddyには、Dockerボリュームをマウントすべき別々の設定ファイルとデータディレクトリもあります。

/config

ディレクトリはオプションですが推奨されます; 設定ファイルを保存しますが、これらはAPIリクエストに変換されるため、厳密には永続化する必要はありません。/data の場所は重要です。なぜなら、Caddyが生成したTLS証明書、秘密鍵、そしてAPIによって処理された最終サーバー設定を保持しているからです。

docker run -d -p 80:80 

-v ./my-website:/usr/share/caddy/

-v caddy-config:/config

-v caddy_data:/data

caddy:2

HTTPサーバーとして、Caddyはデフォルトでポート80で待機します。これは、上の例での-pフラグを介してホストのポート80にバインドされています。

今、ブラウザで http://localhost にアクセスして、あなたのサイトを訪れることができます。マウントされたコンテンツディレクトリの index.html が表示されるはずです。/usr/share/caddy に何もバインドしていなければ、デフォルトの Caddy ランディングページが表示されます。

HTTPSの設定

Caddyの主要な機能の一つは、TLSの自動サポートですが、これを使わないのは無駄です。CaddyがHTTPSトラフィックを受信できるように、ポート80に加えてポート443をバインドする必要があります。他の唯一の変更点は、サイトが提供されるドメイン名を指定することです。それ以外のすべてはCaddyが処理します。

docker run -d -p 80:80 -p 443:443 

-v ./my-website:/usr/share/caddy/

-v caddy-config:/config

-v caddy_data:/data

caddy:2 caddy file-server --domain example.com

画像名の後のコマンドは、docker runによってDockerイメージのエントリーポイントに渡されます。この場合、caddy file-server ...がコンテナのフォアグラウンドプロセスとして実行されることを意味します。--domainフラグは、CaddyがHTTPS証明書を取得するためのドメインを設定するために使用されます。コンテナを起動する前に、DockerホストのIPを参照するAタイプのDNSレコードを確認してください。

自分のCaddyfileを追加する

Caddyは通常、ルートの定義やサーバー設定の変更にCaddyfileという設定ファイルを使用します。Dockerイメージは、/etc/caddy/CaddyfileにCaddyfileを読み込みます。このパスに独自のファイルをマウントすることで、/usr/share/caddyを提供するデフォルト設定を上書きできます。

docker run -d -p 80:80 -p 443:443 

-v ./Caddyfile:/etc/caddy/Caddyfile

-v caddy_data:/data

caddy:2

ここに、HTTPSが有効なサイトexample.comのためのシンプルなCaddyfileがあります:

{

email example@example.com

}

example.com {

respond "It works!"

}

この最小限の設定は、グローバルなメールアドレスをexample@example.comに設定します。このメールアドレスは、Let's Encrypt証明書のリクエストを行う際に使用されます。example.comのブロックは、Caddyがあなたのドメインへのリクエストを処理するためのルーティングルールを提供します。この場合、サーバーは常に静的なメッセージで応答します。

Caddyfileに関する詳細情報はCaddyのドキュメントにあります。Dockerはここで何も変わりません: ファイルが/etc/caddy/Caddyfileで利用可能であれば、Caddyはそれを読み込み、使用します。

サイトのためのDockerイメージの作成

これまで、Caddyのベースイメージから直接コンテナを起動することで、アドホックなCaddyの使用について見てきました。実際には、サイト専用のイメージを作成した方が便利で、コンテナを起動するたびにコンテンツをマウントする必要がなくなります。

Caddyのベースイメージは、コンテンツや設定を追加するための独自の指示で拡張する準備が整いました。ここに、Caddyfileを含み、あなたのサイトのコンテンツをカスタマイズされたディレクトリにコピーするDockerfileの例があります:

FROM caddy:2.4

WORKDIR /my-site

COPY Caddyfile /etc/caddy/Caddyfile

COPY *.html ./

COPY *.css css/

COPY *.js js/

これで、あなたのサイトに合わせて事前設定されたCaddyサーバーを開始するために、イメージをビルドして実行できるようになります:

docker build -t my-site:latest .

docker run -p 80:80 -p 443:443 -v caddy_data:/data my-site:latest

追加モジュールを加える

多くのサイトでは、追加の機能のために追加のCaddyモジュールを含める必要があります。これをDockerfileで処理する最良の方法は、Caddyの専用のbuilderイメージを使用することです。これには、指定されたモジュールがインストールされたカスタムCaddyインスタンスを作成するために必要なツールが含まれています。

Dockerのマルチステージビルドは、このワークフローに最適です。以下は、Caddyのreplace-responseモジュールを追加する例です。このモジュールを使うことで、Caddyfile内のルールを使用してレスポンスデータの一部を書き換えることができます。

FROM caddy:2.4-builder AS caddy-build

RUN xcaddy build --with github.com/caddyserver/replace-response

FROM caddy:2.4

COPY --from=caddy-build /usr/bin/caddy /usr/bin/caddy

WORKDIR /my-site

COPY Caddyfile /etc/caddy/Caddyfile

COPY *.html ./

COPY *.css css/

COPY *.js js/

最初のビルドステージは、replace-responseモジュールが組み込まれたCaddyバイナリを生成します。ビルダーイメージで使用可能なxcaddyコマンドは、その出力を/usr/bin/caddyに配置します。二番目のステージは標準のCaddyベースイメージを使用しますが、含まれているバイナリをカスタムビルドのものに上書きします。その後、あなたのコンテンツは通常通りレイヤー化され、結果として追加のモジュールを組み込みつつ、Dockerベースイメージの他の機能への完全なサポートを維持したCaddyサーバーが得られます。

要約

Caddyは静的ファイルを効率的に提供するための素晴らしい選択である、モダンなウェブサーバーです。HTTPSのファーストクラスサポート、内蔵のテンプレートレンダリング、Markdown統合など、魅力的な機能セットを提供しています。

Dockerを使用してCaddyサーバーをホストすることで、バイナリを手動でダウンロードしたり、サービスファイルをインストールしたりすることなく、インスタンスを迅速にデプロイする方法が得られます。これは、Caddyを試すか、クラスター環境で既存のワークロードと一緒に実行するのに良い方法です。

Caddyはリバースプロキシおよびロードバランサーとして機能するため、他のDockerコンテナへのトラフィックをルーティングするためのエントリポイントとして使用できます。人気のCaddy Docker Proxyモジュールは、Dockerコンテナのラベルを使用した自動ルートディスカバリーのTraefikのようなサポートを通じて、サーバーの組み込み機能を拡張します。

Caddyは、コンテナ内で実行されているインスタンスの管理を簡素化するために、APIファーストのアプローチを取っています。設定ファイルの注入やボリュームの管理についてあまり心配する必要はありません。/dataディレクトリが永続化されている限り、Docker CLIを使用せずにCaddyの動作を変更するためのAPIリクエストを行うことができます。これにより、ApacheやNGINXのような従来のオプションと比較して、コンテナ化においてより良い選択肢となる可能性があります。

関連記事: