DockerでAstroサイトを構築する
Dockerは、コンテナを使ってアプリケーションをビルド、デプロイ、実行するためのツールです。
Dockerイメージとコンテナは、AWS、Azure、Google Cloudのような多くの異なるプラットフォームにデプロイできます。このレシピでは、サイトを特定のプラットフォームにデプロイする方法はカバーしませんが、プロジェクト用にDockerをセットアップする方法を紹介します。
前提条件
セクションタイトル: 前提条件- ローカルマシンにDockerがインストールされていること。使用しているオペレーティングシステムへのインストール手順はこちらを参照してください。
- プロジェクト内にDockerfileが存在すること。Dockerfileについて詳しくはこちらを参照してください。以下のセクションのDockerfileを出発点として使うこともできます。
Dockerfileを作成する
セクションタイトル: Dockerfileを作成するプロジェクトのルートディレクトリにDockerfile
というファイルを作成します。このファイルにはサイトを構築するための指示が含まれおり、ニーズに応じて内容は異なります。このガイドではすべての可能なオプションを紹介することはできませんが、SSRと静的モードのスタートポイントを提供します。
npm以外のパッケージ・マネージャーを使っている場合は、それに応じてコマンドを調整する必要があります。
このDockerfileはNode.jsを使用してサイトを構築し、ポート4321
でサービスを提供します。そのため、AstroプロジェクトにNodeアダプタ (EN)がインストールされている必要があります。
これらはDockerfileの一例です。ニーズに合わせてカスタマイズすることができます。例えば、node:lts-alpine
のように別のイメージを使うこともできます。
.dockerignoreを追加する
セクションタイトル: .dockerignoreを追加するプロジェクトに.dockerignore
ファイルを追加するのがベストプラクティスです。このファイルには、DockerのCOPY
コマンドやADD
コマンドで無視するファイルやフォルダを記述します。これはビルドプロセスを高速化し、最終的なイメージのサイズを小さくします。
このファイルはDockerfile
自体と同じディレクトリに置く必要があります。詳しくは.dockerignore
ドキュメントを読んでください
Static
セクションタイトル: StaticApache (httpd)
セクションタイトル: Apache (httpd)以下のDockerfileは、サイトをビルドし、それをApache htppdによりデフォルトの設定でポート80
にて配信します。
特別な設定を必要としない単純なウェブサイトには、この方法を使用してください。より複雑なウェブサイトの場合は、ApacheまたはNGINXでカスタム設定を使用することをお勧めします。
NGINX
セクションタイトル: NGINX上記のDockerfileをビルドするには、NGINX用の設定ファイルも作成する必要があります。プロジェクトのルートディレクトリにnginx
というフォルダを作成し、その中にnginx.conf
というファイルを作成します。
マルチステージビルド(SSRを使用)
セクションタイトル: マルチステージビルド(SSRを使用)以下は、Dockerのマルチステージビルドを用い、ソースコードのみが変更された場合にnpmの依存関係を再インストールしないようにすることで、サイトのビルドプロセスを最適化する、より高度なDockerfileの例です。これにより、依存関係のサイズにもよりますが、ビルド時間を場合によっては数分程度短縮できます。
- プロジェクトのルートディレクトリで以下のコマンドを実行してコンテナをビルドします。
<your-astro-image-name>
には任意の名前を使用してください。
これでイメージが出力され、ローカルで実行することも、好きなプラットフォームにデプロイすることもできます。
- イメージをローカルコンテナとして実行するには、以下のコマンドを使用します。
<local-port>
を自分のマシンの使用されていないポートに置き換えてください。また <container-port>
をDockerコンテナが公開しているポートに置き換えてください(上記の例では4321
、80
、8080
)。
http://localhost:<local-port>
からサイトにアクセスできるはずです。
- これでウェブサイトが正常にビルドされ、コンテナにパッケージ化されたので、クラウドプロバイダにデプロイすることができます。例としてGoogle Cloudのデプロイガイドや、DockerドキュメントのDeploy your appページを参照してください。