多年にわたり、アプリケーションやツールは人々の変化する要件や期待に遅れを取らないようにより複雑になってきました。しかし、これによってコードの互換性やリモートアクセスの問題が生じることがあります。例えば、Windows上で正常に機能するコードベースがLinuxにインストールされると互換性のエラーが発生する可能性があります。
幸いなことに、Dockerが救世主となります。しかし、あなたはおそらく疑問に思っているかもしれません – Dockerとは何か、そしてどのように役立つのでしょうか?このチュートリアルでこれらすべてを学ぶことができます。
しかし、始める前に、いくつかの前提条件があります:
-
Linuxコマンドの知識
-
ターミナルの使用方法の知識
-
Node.jsとExpress.jsの知識
目次
Dockerとは何ですか?
Dockerは、ソフトウェアをどこでも一貫した方法で実行できるようにするオープンソースのツールです。これは、アプリケーションとその必要なすべて(ライブラリや設定など)をコンテナに入れることで行います(後で詳しく説明します)。
コンテナは箱のようなものと考えてください:それはあなたのアプリとそのすべての部品を保持し、したがって、それはあなたのノートパソコン、サーバ、またはクラウド上でまったく同じように機能します。Dockerは、すべてが信頼性のあるポータブルな方法でパッケージ化されていることを確認することで、開発者が「私のマシンでは動作する」という問題を回避するのに役立ちます。
Dockerは2013年にSolomon Hykesによって作成されました。これまでにさまざまなツールをカバーするように進化してきました。アプリケーションの展開とネットワーキングプロセスの改善のための必須ツールになっています。
続行する前に、このチュートリアルを進める際に遭遇するいくつかのキーワードをご紹介します:
Docker Engine
Dockerエンジンは、その名前が示すように、Dockerアプリケーションの動力源です。クライアントとサーバーのコンポーネントがあります。Dockerクライアントは、この場合、プロジェクトの実行に関連するコマンドを送信するために使用するコマンドラインインターフェースツールまたはDockerターミナルです。Dockerサーバーは、デーモンとして広く知られており、さまざまなDockerイメージとコンテナを実行するサーバーです。
Dockerイメージ
Dockerイメージは、実行可能ソフトウェアやシステムの事前作成テンプレートです。Dockerには、オペレーティングシステムのテンプレートからサーバーテンプレート、ソフトウェアテンプレートなど、幅広いイメージが提供されています。これらのイメージはDockerハブレジストリに保存されています。
特定のイメージを構築して、それをDockerハブで公開するか、プライベートなレジストリに保存することもできます。
Dockerコンテナ
Dockerコンテナは、Dockerイメージで生成されたテンプレートに基づいて構築された実行可能なコンパクトなインスタンスです。コード、ランタイム、ライブラリ、システムツールなど、ソフトウェアを実行するために必要なすべてが含まれています。コンテナは、環境に関係なくアプリケーションが一貫して実行されることを確認します。
Dockerの利点
ここでは、バックエンド開発者がDockerを使用する際の利点のいくつかを挙げます:
-
Dockerは、開発チームと運用チームの機能を明確にするための堅固なDevOps文化を作成するための優れたツールです。
-
また、非常に柔軟で、マイクロサービスや分散モノリシックバックエンドアプリケーションの容易なデプロイを可能にします。
-
それは、アプリを必要な依存関係と一緒に一度にポートするため、インストール中の依存関係の誤設定からのエラーを最小限に抑えます。
次に、Node.JS ExpressアプリケーションをDocker化する方法について詳しく見ていきます。しかしその前に、コンピュータにDockerをインストールする必要があります。すでにインストールされている場合は、このステップをスキップできます。
Dockerのインストール方法
Dockerは、すべての主要なオペレーティングシステム(Windows、Mac OS、およびLinuxディストリビューション)にインストールできるクロスプラットフォームツールです。このチュートリアルでは、WindowsにDockerを設定する方法のみを強調します。
現在Windows以外のOSを使用している場合は、Dockerのドキュメントの手順に従うことで簡単にDockerを設定できます ここ。
Windowsユーザーにとって、PCが最低限の仕様を満たしていることが重要です。さもなければ、インストールは成功しません。最低要件は以下の通りです:
-
Windows 10 Home以上のWindows OSバージョン
-
WSL-2がインストールされているか、ハイパーバイザーが有効なPC。
では、Dockerインストーラーの実行ファイルをダウンロードしましょう。最新のDockerインストーラーはここからダウンロードできます。ダウンロードが完了したら、ソフトウェアを実行し、利用規約に同意してください。インストールが成功したら、アプリケーションを起動します。これが表示されるはずです:
アプリケーションが正しくインストールされたことを確認するには、コマンドプロンプト端末に移動し、Docker –-version
を実行します。インストールが成功していれば、インストールしたDockerエンジンツールの正確なバージョンが表示されるはずです。
これで、プロジェクト本体に進みます。
デモプロジェクト: Node.jsアプリケーションをコンテナ化する方法
このセクションでは、最小限の依存関係でシンプルなNode.jsベースのバックエンドサービスをコンテナ化します。これは、Dockerfileと呼ばれるDockerアプリケーションコンテナ化技術を使用してアプリケーションをコンテナ化およびポートする方法を示します。より複雑なアプリケーションがある場合は、Docker compose YAMLツールを使用する方が良いかもしれません。
まず、サンプルのNode.jsアプリケーションをセットアップします。この記事では、以下にコードセットアップを提供します。しかし、まずはdockerfileが何かを理解しましょう。
Dockerfileとは何ですか?
基本的に、Dockerfileはユーザーが入力したコマンドによって実行されると、アプリケーションの機能イメージを生成することができるテンプレートシステムです。このイメージはその後コンテナに変換されます。
以下は、Dockerfileの基本構造に含まれるいくつかのコマンドです:
-
CMD
:コンテナが起動する際にコマンドが指定されていない場合に実行されるデフォルトのコマンドを設定します。コンテナを実行する際にコマンドを指定することで上書きできます(docker run ...
)。 -
ENTRYPOINT
:コンテナが起動する際に常に実行される主要なコマンドを指定します。簡単に上書きすることはできませんが、引数を追加することはできます。
注意:CMD
とENTRYPOINT
はどちらもコンテナが起動する際に実行するコマンドやプロセスを指定しますが、異なる方法で使用され、異なる目的があります。上書き可能なデフォルトの動作にはCMD
を使用します。コンテナの主要な目的を定義する固定されたコマンドにはENTRYPOINT
を使用します。 -
FROM
:これは通常、Dockerfile内の最初のステートメントです。このコマンドは、特定のアプリケーションのイメージを構築する基盤となるベースイメージを取得します。たとえば、当社のアプリケーションでは、Node.jsアプリケーションのベースイメージはベースラインのNode.jsエンジンがインストールされていることが求められます。 -
WORKDIR
:この構文は、定義されたコンテナ内でアプリケーションファイルが配置されるアクティブな作業ディレクトリを定義します。必要に応じて自動的にフォルダが作成されます。 -
COPY
: この構文は、コードベースプロジェクトファイルからDockerイメージを作成するために必要なファイルが、新しく作成されたDockerコンテナにコピーされることを保証するために使用されます。これらのファイルのディレクトリが慎重に強調されています。 -
RUN
: この構文は、アプリケーションのコンテナ化を完了する前に実行したいスクリプトを指定します。 -
ENV
: この構文は、アプリケーションの実行中に呼び出される環境変数と秘密を強調するために使用されます。 -
EXPOSE
: この構文は、アプリケーションが外部インターネットと通信するために使用されるブラウジングポートをマッピングします。例えば、EXPOSE: 3000
は、アプリケーションのウェブインターフェースをlocalhost:3000
にマッピングします。
Dockerの詳細を調べる際に、このチュートリアル全体で使用するいくつかの主要なDockerコマンドをさっと見てみましょう:
-
Docker ps
:このコマンドは、Dockerターミナル上で実行中のすべてのコンテナをリストします。 -
Docker run
:このコマンドは、Dockerイメージを実行してコンテナのインスタンスをトリガーします。 -
Docker build
:このコマンドは、Dockerファイルに基づいてサービスやアプリケーションのイメージを生成します。 -
Docker rm
:このコマンドは、イメージの識別詳細を使用してイメージを削除するために使用できます。
アプリケーションをコンテナ化する方法
今、私たちはシンプルなNode/Expressアプリケーションをコンテナ化することを始めることができます。このチュートリアルに従うには、ベースコードをこちらから取得できます。
ローカルでテストすると、CRUD APIが返され、実行時に製品を作成、取得、更新、および削除できます。私たちは、Dockerエンジンを使用してクラウドへの簡単なデプロイのためにアプリケーションをパッケージ化します。これは、上で説明したDockerfileツールを使用して実現できます。
ステップ1:dockerfileを作成する
プロジェクトフォルダー内に、Dockerfile
という名前のファイルを作成します。名前が正確に “Dockerfile”(拡張子なしであり、一部のシステムでは大文字と小文字を区別するため、必ず大文字にしてください)であることを確認してください。
コードエディタを使用している場合は、新しいファイルをDockerfile
という名前で作成するだけです。基本的なテキストエディタを使用している場合は、ファイルをDockerfile
という名前で保存し、.txt
のような拡張子が付かないようにしてください。
次に、最初の行を入力します:
FROM Node:18-alpine
このコマンドは、私たちのExpressアプリケーションを動かすために使用するベースイメージを取得します。それはNodeエンジンそのものです。
alpine
が何のためにあるのか不思議に思うかもしれません。Alpineは、Dockerイメージの軽量で、はるかに圧縮されたバージョンです。基本オペレーティングシステムに直接必要な追加パッケージを取り入れることを除外しています。軽量ディストリビューションを使用することは、より迅速な実行と使いやすさのための標準的な良いコードプラクティスとして推奨されています。
ステップ2:作業ディレクトリを設定する
WORKDIR /app
これは、イメージの作業ディレクトリをコンテナの/app
フォルダーに設定します。これにより、すべてのファイル操作がここで行われ、すべてのファイルがこのディレクトリにコピーされることが保証されます。
ステップ3: 必要なファイルをコピーする
COPY package.json
このコマンドは、依存関係とアプリケーションを動かすためにインストールするパッケージのリストを含むpackage.json
ファイルをコピーします。
ステップ4: セットアップスクリプトを実行する
RUN npm install
このコマンドは、Node.jsアプリケーションを動かすために必要なすべての依存関係がコンテナにインストールされていることを確認します。
ステップ5: コードファイルをコピーする
COPY . .
このコマンドは、ローカルディレクトリ内のすべてのファイルが確立された作業ディレクトリ内のコンテナファイルシステムにコピーされることを保証します。
ステップ6: サーバーポートを公開する
EXPOSE 3000
このコマンドは、コンテナにアクセスするために使用する予定のサーバーポートを公開します。この場合、ポート3000です。
ステップ7: コンテナを起動させるコマンドを含める
CMD ["npm", "run", "dev"]4
このコマンドは、Node.jsアプリケーションを起動するために最後に実行されます。これは、開発環境で使用するnpm run dev
コマンドを単に実行します。生産環境で実行するには、代わりにnpm start
コマンドを使用します。
このプロセスを完了した後、最終的なDockerfileの構造は次のようになります:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
Dockerコンテナのテスト
要約すると、Node.jsアプリケーションのDockerイメージを作成します。これを行うには、コマンド docker build -t nodeapp .
を実行します。docker build
コマンドはイメージをビルドし、-t
オプションはイメージタグの詳細を指定することができます。
この場合、作成するイメージに nodeapp
という名前を付け、イメージは作業ディレクトリ内に作成されます。
おめでとうございます!あなたは初めてのDockerイメージを成功裏にビルドしました。ローカルリポジトリ内のすべてのイメージを見るには、コマンド docker images
を実行します。
テスト用にイメージの作業インスタンスを作成するには、コマンド docker run nodeapp
を実行します。
このチュートリアルではMongoDBをデータベースとして使用するので、MongoDBのURLをDockerコンテナに環境変数として渡す必要があります。環境変数は、公開されるべきではない特定の重要な変数を保護するのに役立ちます。環境変数として渡すことができる他の変数にはAPIキーや暗号化コードが含まれます。
MongoDBのURLをDockerコンテナに渡すには、-e
オプションを使用して、Dockerが環境変数として入力された値を認識できるようにします。
docker run -e JWT_SECRETS={お好みの値を入力} -e MONGO_URL={お好みのMongo URL} nodeapp
を実行します。
コンテナをバックグラウンドで使用するには、デタッチオプションを表す -d
オプションを追加してください。このオプションにより、コマンドラインターミナルを終了してもコンテナがバックグラウンドで実行され続けます。
エラーがない場合、localhost:5000
にアクセスすると、以下の画像に似たものが表示されるはずです。
まとめ
この記事では、Dockerの概要や動作方法、一般的なコマンド、バックエンドアプリケーションをコンテナ化する方法について学びました。基本から進んで、Dockerの他の利用方法を探求することもできます。継続的インテグレーションや開発におけるDockerの使用方法について詳しく知りたい場合は、こちらのドキュメントを参照してください。
新しい知識を活かして、実用例を持つプロジェクトを展開したり、Dockerアプリケーションのネットワーキングを探求したりすることをお勧めします。アプリを公開するには、作成したDockerイメージをAWS、GCP、Azureなどの人気クラウドサービスプロバイダーのいずれかに簡単にデプロイできます。
質問があれば遠慮なくどうぞ!他の記事もこちらでご覧いただけます。次回もコーディングを楽しんでください!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/