コンテナ化されたNode.jsアプリケーションをNginx、暗号化、Docker Composeで保護する方法

前書き

https://nodejs.org [Node.js]アプリケーションの柔軟性とセキュリティを強化する方法は複数あります。 reverse proxy(https://www.nginx.com/[Nginx]など)を使用すると、負荷を分散することができます。リクエスト、静的コンテンツのキャッシュ、Transport Layer Security(TLS)の実装。 サーバーで暗号化されたHTTPSを有効にすると、アプリケーションとの通信が安全に保たれます。

コンテナにTLS / SSLを使用してリバースプロキシを実装するには、ホストオペレーティングシステムで直接作業する場合とは異なる一連の手順が必要です。 たとえば、サーバーで実行されているアプリケーションの証明書をhttps://letsencrypt.org/[Let’s Encrypt]から取得している場合、必要なソフトウェアをホストに直接インストールします。 コンテナを使用すると、異なるアプローチを取ることができます。 Docker Composeを使用して、アプリケーション、Webサーバー、およびhttps://certbot.eff.org/[Certbot client]のコンテナを作成して、それを有効にすることができます証明書を取得します。 これらの手順に従うことで、コンテナ化されたワークフローのモジュール性と移植性を活用できます。

このチュートリアルでは、Docker Composeを使用して、Nginxリバースプロキシを使用してNode.jsアプリケーションをデプロイします。 アプリケーションに関連付けられたドメインのTLS / SSL証明書を取得し、https://www.ssllabs.com/ [SSL Labs]から高いセキュリティ評価を受けることを確認します。 最後に、https://www.digitalocean.com/community/tutorials/how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps [+ cron +]を設定しますドメインを安全に保つために証明書を更新する仕事。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • Ubuntu 18.04サーバー、 `+ sudo +`特権を持つ非rootユーザー、およびアクティブなファイアウォール。 これらの設定方法に関するガイダンスについては、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [初期サーバー設定ガイド]をご覧ください。

  • サーバーにインストールされたDockerおよびDocker Compose。 Dockerのインストールに関するガイダンスについては、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04のステップ1および2を参照してください。 Ubuntu 18.04でDockerを使用してください]。 Composeのインストールに関するガイダンスについては、https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-18-04のステップ1に従ってください[Ubuntu 18.04にDocker Composeをインストールする方法] ]。

  • 登録済みのドメイン名。 このチュートリアルでは、全体を通して* example.com *を使用します。 Freenomから無料で入手するか、選択したドメインレジストラーを使用できます。

  • 次の両方のDNSレコードがサーバーに設定されています。 DigitalOceanアカウントに追加する方法の詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-dns [このDigitalOcean DNSの概要]を参照してください。再使用:

  • サーバーのパブリックIPアドレスを指す「++」を持つAレコード。

  • サーバーのパブリックIPアドレスを指す「+ www。+」を持つAレコード。

手順1-ノードアプリケーションの複製とテスト

最初のステップとして、Composeを使用してアプリケーションイメージをビルドするために使用するDockerfileを含むNodeアプリケーションコードを使用して、リポジトリのクローンを作成します。 `+docker run + `commandを使用して、リバースプロキシやSSLを使用せずにアプリケーションをビルドして実行することで、最初にアプリケーションをテストできます。

非ルートユーザーのホームディレクトリで、https://github.com/doからhttps://github.com/do-community/nodejs-image-demo [`+ nodejs-image-demo +`リポジトリ]を複製します。 -community [DigitalOcean Community GitHubアカウント]。 このリポジトリには、https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker [Node.jsアプリケーションの構築方法]で説明されているセットアップのコードが含まれています。 Docker]。

リポジトリを `++`というディレクトリにクローンします:

git clone https://github.com/do-community/nodejs-image-demo.git

`++`ディレクトリに移動します。

cd

このディレクトリには、https://hub.docker.com/_/node/ [Docker + node:10 + image]と現在のプロジェクトのコンテンツを使用してNodeアプリケーションを構築するための手順を含むDockerfileがありますディレクトリ。 次のように入力して、Dockerfileの内容を確認できます。

cat Dockerfile
OutputFROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

CMD [ "node", "app.js" ]

これらの手順は、プロジェクトコードを現在のディレクトリからコンテナにコピーし、 + npm install +`で依存関係をインストールすることにより、ノードイメージを構築します。 また、 `+ packageのコピーを分離することにより、Dockerのhttps://www.digitalocean.com/community/tutorials/building-optimized-containers-for-kubernetes#managing-container-layers [キャッシュとイメージレイヤー]を利用します。 json + `および + package-lock.json + `。残りのアプリケーションコードのコピーから、プロジェクトのリストされた依存関係を含みます。 最後に、手順は、アプリケーションコードと `+ node_modules +`ディレクトリに適切な権限が設定された非ルート* node *ユーザーとしてコンテナが実行されることを指定します。

このDockerfileおよびNodeイメージのベストプラクティスの詳細については、https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker#の完全な説明を参照してください。 step-3-%E2%80%94-writing-the-dockerfile [DockerでNode.jsアプリケーションを構築する方法のステップ3]。

SSLを使用せずにアプリケーションをテストするには、https://docs.docker.com/engine/reference/commandline/build/ [+ docker build +]および `+ -t `フラグを使用してイメージをビルドおよびタグ付けできます。 画像を「+」と呼びますが、別の名前を自由に付けることができます。

docker build -t  .

ビルドプロセスが完了すると、https://docs.docker.com/engine/reference/commandline/images/ [+ docker images +]で画像を一覧表示できます。

docker images

次の出力が表示され、アプリケーションイメージのビルドが確認されます。

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          latest              23961524051d        7 seconds ago       73MB
node                10-alpine           8a752d5af4ce        3 weeks ago         70.7MB

次に、 `+ docker run`でコンテナを作成します。 このコマンドには3つのフラグが含まれます。

  • + -p +:これはコンテナ上のポートを公開し、ホスト上のポートにマッピングします。 ホストではポート「80」を使用しますが、そのポートで別のプロセスを実行している場合は、必要に応じて自由に変更してください。 これがどのように機能するかについての詳細は、https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/ [ポートバインディング]のDockerドキュメントのこの説明を参照してください。

  • + -d +:これはバックグラウンドでコンテナを実行します。

  • +-name +:これにより、コンテナに覚えやすい名前を付けることができます。

次のコマンドを実行して、コンテナを構築します。

docker run --name  -p 80:8080 -d

`+docker ps + `で実行中のコンテナを検査します。

docker ps

アプリケーションコンテナが実行されていることを確認する出力が表示されます。

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
4133b72391da                   "node app.js"       17 seconds ago      Up 16 seconds       0.0.0.0:80->8080/tcp

ドメインにアクセスして、セットアップをテストできます: + http:// +。 `++`を自分のドメイン名に置き換えることを忘れないでください。 アプリケーションには、次のランディングページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

アプリケーションをテストしたので、コンテナーを停止してイメージを削除できます。 もう一度 `+ docker ps `を使用して、 ` CONTAINER ID +`を取得します。

docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
                  "node app.js"       17 seconds ago      Up 16 seconds       0.0.0.0:80->8080/tcp

https://docs.docker.com/engine/reference/commandline/stop/[`docker stop + `]でコンテナを停止します。 ここにリストされている ` CONTAINER ID `を独自のアプリケーション ` CONTAINER ID +`に置き換えてください:

docker stop
Related