Dockerの最も一般的なワークロードの1つは、Dockerを使用してNGINXやApacheなどのWebサーバーをコンテナ化し、簡単に自動スケーリングおよび管理できる高性能のコンテンツ配信フリートを実行することです。 NGINXで設定する方法を紹介します。
Docker内でのNGINXのセットアップ
Dockerはコンテナ化プラットフォームであり、アプリケーションとそのすべてのコードを1つの管理しやすいコンテナイメージにパッケージ化するために使用されます。これを行うプロセスは、新しいサーバーをセットアップする方法と非常によく似ています。コンテナーは白紙の状態であるため、依存関係をインストールし、コードをビルドし、ビルドアーティファクトをコピーし、コピーする必要があります。任意の構成。幸い、それほど自動化する必要はありません。 NGINXにはすでに公開されているDockerコンテナがあり、アプリケーションの開始点として使用できます。
もちろん、コンテナ化するアプリケーションによっては、これはもう少し複雑になる可能性があります。 WordPressのようなCMSを導入する場合、コンテナは永続的になるように設計されていないため、外部データベースが必要になる可能性があります。特に、WordPressを始めるのに適した場所は、WordPressのDockerコンテナです。
単純なHelloWorldWebページよりも少し複雑なものにするために、新しいプロジェクトディレクトリを作成し、基本的なVue.jsアプリケーションを初期化します。提供するコンテンツによって構成は異なりますが、一般的な考え方は同じです。
プロジェクトのルートで、単にDockerfile
という名前の新しいファイルを作成します。 拡張子なし。これはビルド構成として機能します。デフォルトでは、コンテナは空であり、ベースイメージとともにインストールされるアプリケーションと依存関係のみが含まれます。アプリケーションのコードをコピーする必要があります。静的コンテンツを提供するだけの場合、これは簡単ですが、WordPressなどのサーバー側アプリケーションを使用している場合は、追加の依存関係をインストールする必要がある場合があります。
次の設定はかなり基本的なものです。これはノードアプリケーションであるため、npm run build
を実行する必要があります 配布可能なビルドを取得します。 2つの部分からなるコンテナビルドを設定することで、これをすべてDockerfileで処理できます。
FROM node:latest as build-stage WORKDIR /src COPY package*.json ./ RUN npm install COPY ./ . RUN npm run build FROM nginx as production-stage RUN mkdir /src COPY --from=build-stage /src/dist /src COPY nginx.conf /etc/nginx/nginx.conf
最初の行のFROM
コマンドはnode
をプルします Docker Hubのコンテナで、build-stage
という新しいコンテナを作成します 。次のcd
をそのディレクトリに移動し、package.json
にコピーします 。次に、npm install
を実行します 、次にアプリのコードをコピーしてビルドプロセスを開始します。アプリケーションをソースから構築する必要がある場合は、これと同様のことを行う必要があります。
次の状態はnginx
をプルします 本番デプロイメントとして機能するコンテナー。 src
になります ディレクトリを作成し、build-stage
からコピーします コンテナ、/src/dist/
/src
へのビルドアーティファクトを含むフォルダー 本番コンテナのフォルダ。次に、NGINX構成ファイルをコピーします。
また、.dockerignore
という名前の新しいファイルを作成することもできます。 、node_modules
を無視するように指示します ローカルビルドからのビルドアーティファクトも同様です。
**/node_modules **/dist
Dockerfileはnginx.conf
を参照します 、これも作成する必要があります。 /sites-available
に複数の構成があるより複雑な構成を実行している場合 、NGINX構成用の新しいフォルダーを作成し、それをコピーすることをお勧めします。
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /src; index index.html; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
これは単なるHTTPWebサーバーです。 HTTPSを設定する最も簡単な方法は、LetsEncryptのcertbotをローカルで実行し、/etc/letsencrypt/live/example.com/fullchain.pem
から証明書をコピーすることです。 生産コンテナに。これらの証明書は90日間有効であるため、定期的に更新する必要があります。コンテナビルドプロセスの一部としてこれを自動化できます。
すべてが整ったら、Dockerビルドを実行できます:
docker build . -t my-app
これにより、コンテナがmy-app
としてビルドされます。 、その後、自由にタグを付けて、最終的な展開のためにECSまたはコンテナレジストリに送信できます。もちろん、最初にdocker run
を使用してローカルでテストする必要があります バインディングlocalhost:8080
NGINXインスタンスのポート80へ:
docker run -d -p 8080:80 my-app
ビルドされたイメージを作成したら、それを本番環境にデプロイするのは非常に簡単です。詳細については、AWS ECSでの自動スケーリングコンテナデプロイのセットアップに関するガイドを読むか、自動ビルドとデプロイを処理するためのコンテナーを使用したCI/CDパイプラインのセットアップに関するガイドをお読みください。
関連: PEMファイルとは何ですか。どのように使用しますか?