あなたのNODEJSのドッカー画像のサイズを複数の


カバーイメージIan Taylor on Unsplash
Dockerはすぐに生成し、さまざまなプラットフォームにあなたのNODEJSアプリケーションのコンテナを展開する素晴らしいツールです.しかし、あなたが最終的なコンテナイメージのサイズをチェックしたならば、あなたはイメージがかなり重いとわかることができたかもしれません.MBまでの数百MBまでは珍しくありません.
このメモリサイズは異なる問題につながる.まず最初に、あなたのDockerイメージはあなたのマシンのディスク領域をたくさん消費します.第2の問題は、Docker Hubのようなレジストリからイメージをダウンロードすることは、ネットワーク接続によってかなりの時間がかかることです.あなたのアップロード帯域幅が通常あなたのアップロード帯域幅より数倍小さいので、この問題はあなたのイメージをアップロードするためにさらに悪くなります.
ご覧のように、あなたのDocker画像をできるだけ小さく保つ理由がたくさんあります.この記事では、異なるテクニックを使用してDocker画像のサイズを小さくする方法を示します.

必要条件
このチュートリアルでは、次のプログラムをマシンにインストールする必要があります.
  • NodeJS
  • Docker

  • 始める
    我々は、基本を使用しますAdonisJS この記事のアプリとDocker画像の中にパッケージします.
    まず第一に、我々はadonisjsアプリを作成し、次のコマンドを実行し、プロンプトに応答します.プロジェクトの構造についてはweb プロジェクト構造.
    npm init adonis-ts-app@latest hello-docker-world
    
    次に、私たちはhello-docker-world ディレクトリと実行して新しいアプリケーションをテスト
    node ace serve --watch
    
    その後、あなたは開くことができますlocalhost:3333 お気に入りのブラウザで、あなたの新しいテストアプリケーションを表示する必要があります.
    今すぐ我々のアプリケーションをDocker画像にパッケージを開始することができます.したがって、最初に新しいファイルを作成しますDockerfile プロジェクトディレクトリ内に次のスニペットをファイルに貼り付けます.
    FROM node:14
    WORKDIR /myapp
    COPY . .
    RUN npm install && node ace build --production
    CMD node build/server.js
    
    これは、Dockerレジストリからノードベースのイメージをプルします/myapp , そして、ローカル作業ディレクトリの内容をイメージワーキングディレクトリにコピーします.その後、実行されますnpm insall プロジェクトの依存関係をインストールし、生産のためのアプリケーションを構築する.コンテナイメージが実行されるとCMD コマンドはコンテナ内で実行され、ウェブサーバを起動します.
    DockerFileが何をしているかを知っているので、私たちのイメージを構築する時間です.したがって、プロジェクトディレクトリ内に次のコマンドを実行します.
    docker build -t adonisjs:full .
    
    これは、プロジェクトディレクトリのDockerFileからの指示を調べ、指示に基づいてイメージを構築し、結果としてのイメージをタグ付けしますadonisjs:full .
    その後、実行して画像を一覧表示できます
    docker image ls
    
    そして、あなたは、そのサイズで新しく作成されたイメージが表示されます.私の場合は1.13 GBでかなり重かったです.
    REPOSITORY    TAG           IMAGE ID       CREATED         SIZE
    adonisjs      full          8c35e9442e40   2 minutes ago   1.13GB
    
    これはnode:14 Debianのストレッチwhitパッケージに基づいています.
    ノードを使用する代わりに、我々のDockerイメージのサイズを減らす1つのアプローチは、ノードを使用している14のストレッチイメージ:14のアルパイン・ベースのイメージです.このイメージは、最小限のLinuxと他のベースイメージよりはるかに小さいアルパインLinuxに基づきます.
    新しいベースイメージを使用するにはDockerfile を参照してください.
    FROM node:14-alpine
    WORKDIR /myapp
    COPY . .
    RUN npm install && node ace build --production
    CMD node build/server.js
    
    その後、我々は実行
    docker build -t adonisjs:alpine .
    
    これは再び我々のプロジェクトからのイメージを構築するが、今回は、アルパインベースのイメージとタグに基づいてadonisjs:alpine .
    あなたが現在使用しているDockerイメージをリストするときdocker image ls , あなたは、最初のイメージより非常に小さいあなたの新しいイメージを見ます.私の場合では、新しいイメージには303 MBだけがあります.
    REPOSITORY    TAG           IMAGE ID       CREATED         SIZE
    adonisjs      full          8c35e9442e40   2 minutes ago   1.13GB
    adonisjs      alpine        43e7a8874973   4 minutes ago   303MB
    
    しかし、我々はより小さなイメージを得ることができて、以下のアプローチでより多くのスペースを節約することができます.

    マルチステージビルド
    現時点では、プロジェクトフォルダのコンテンツ全体がイメージ内にコピーされ、プロジェクトの依存関係がインストールされます.その後、あなたのイメージはすべてのプロジェクト関連ファイルを含みます、しかし、それらのすべては生産のために必要です.たとえば、ソースファイルを必要としないし、devの依存関係もプロダクションイメージに含める必要はありません.
    この問題を解決するには、多段ビルドを使用できます.まず、我々は再び更新されますDockerfile 次のスニペットを使用します.
    FROM node:14-alpine AS build
    WORKDIR /myapp
    COPY . .
    RUN npm install && node ace build --production
    
    FROM node:14-alpine
    COPY --from=build /myapp/build /build
    CMD node build/server.js
    
    再び、これはnode:14-alpine ベースイメージとしてイメージbuild . 前の手順と同様に、我々はコピーして、我々のアプリケーションを構築するが、これらの手順の後に終了しません.ご覧のように、アプリケーションを構築した後に、新鮮なベースイメージを使用して、生成されたビルドディレクトリのみをbuild 私たちの新しい生産イメージになる新しいイメージへのイメージ.
    このアプローチを使用すると、すべての必要な依存関係を持つ完全なビルド環境を持つことができます.それでも、生産イメージを出荷することになるとき、我々は我々のアプリケーションを実行するために必要最小限のベースイメージと我々が必要とする生成されたファイルだけを使うことができます.
    今、あなたは再び構築し、次のコマンドを使用してイメージをタグ付けすることができます
    docker build -t adonisjs:multistage .
    
    そして、実行してすべての画像を一覧表示docker image ls .
    あなたは見ることができます、結果として生じるイメージのサイズは再び私のケースで減少しました.
    REPOSITORY    TAG           IMAGE ID       CREATED         SIZE
    adonisjs      full          8c35e9442e40   2 minutes ago   1.13GB
    adonisjs      alpine        43e7a8874973   4 minutes ago   303MB
    adonisjs      multistage    6f91568fbe8f   6 minutes ago   117MB
    
    ご覧のように、多段ビルドは、私たちが私たちの最終的なDockerイメージのサイズを10倍に減らすのを助けました.
    多段ビルドについてもっと読みたい場合は、公式Dockerドキュメントを参照してくださいhere
    私はあなたの記事とハッピーコーディングを楽しんでほしい🧑‍💻