今さら聞けないDockerfileの書き方|基本から最適化までやさしく解説

Dockerfileは、Dockerイメージの設計図です。少しの工夫でイメージサイズを小さくしたり、ビルドを高速化することができます。この記事では、基本構文からよく使う命令、軽量化のコツ、そしてマルチステージビルドの実践例まで、初心者〜中級者向けにやさしく解説します。

Dockerfileの基本構文

Dockerfileは命令が1行ずつ上から順に実行されていきます。それぞれの命令はレイヤーとして積み重なり、キャッシュとして再利用される仕組みになっています。このレイヤー構造を理解し、変更の少ない命令を先に記述することで、無駄なビルドを避けて時間を短縮できます。命令の順序や構成の工夫により、より軽量かつ効率的なDockerイメージを作成することが可能です。

よく使う命令と書き方

  • FROM:ベースとなるイメージ(OSやランタイム)を指定
  • WORKDIR:作業ディレクトリを設定。以降の命令はこのディレクトリ内で実行
  • COPY:ファイルやディレクトリをコンテナ内にコピー
  • RUN:イメージ作成時に一度だけ実行。パッケージインストールなど
  • CMD:コンテナ起動時に実行されるデフォルトコマンド
  • ENTRYPOINT:CMDに渡された値を引数として使う固定コマンド。再利用性の高い起動処理に活用
  • EXPOSE:アプリケーションがリッスンするポート番号を定義(実際のポート開放は docker run の -p オプション)

Dockerfileにはさまざまな命令があり、それぞれの役割を正しく理解することが重要です。

たとえばFROMはベースイメージを指定し、WORKDIRで作業ディレクトリを設定します。COPYRUNはファイルコピーやスクリプト実行を行いますが、順番次第でキャッシュの効き方が変わります。特にCMDENTRYPOINTの違いは混同されやすく、CMDは実行時の引数、ENTRYPOINTは実行コマンドの本体という役割があります。

イメージを軽くするTips

軽量なDockerイメージを作ることで、ビルドやデプロイの速度向上、セキュリティリスクの低減、リソースの節約など多くのメリットがあります。まず、ベースイメージにはalpineslimなどの軽量版を使うことが基本です。.dockerignoreを設定して無関係なファイルを除外することで、無駄な容量とビルド時間を減らせます。さらに、COPYRUNの順序にも注意を払い、キャッシュが最大限活用されるように工夫しましょう。不要ファイルの削除も忘れずに。

  • 軽量ベースイメージを選ぶnode:20-slimalpine 系のイメージを使うとサイズが劇的に減少
  • .dockerignore を活用node_modules.git など不要なファイルは除外
  • COPYとRUNの順序に注意:キャッシュを効かせるため、package.json → install → ソースコードの順で
  • 不要なキャッシュ削除apt-get cleanrm -rf /var/lib/apt/lists/* でパッケージ後の不要データ削除

マルチステージビルドとは?

マルチステージビルドとは、1つのDockerfile内で複数のステージ(FROM)を定義し、それぞれに役割を持たせて構築を進める手法です。最初のステージでビルドやテストなどの重い処理を行い、最終ステージでは必要なファイルのみを取り出して軽量なイメージを作成します。

これにより、本番環境には不要な依存やツールを含めずに済み、セキュリティやパフォーマンス面でも大きなメリットがあります。

実践:Node.jsアプリのマルチステージ例

Node.jsアプリケーションのマルチステージビルドでは、まず最初のステージで依存パッケージのインストールやビルド処理を行い、その成果物だけを本番用のイメージにコピーします。

たとえば、npm cinpm run buildを使ってdistフォルダを生成し、軽量なnode:20-slimイメージに必要なファイルだけをCOPY --fromで転送します。さらにnpm install --omit=devを使えば、開発依存を省いた状態で本番に適した構成が完成します。

まとめ

  • Dockerfileは命令の順序や構成により性能・サイズが大きく変わる
  • よく使う命令(COPY・RUN・CMDなど)の理解が第一歩
  • マルチステージビルドを使えば本番環境向けの軽量化が実現

次回は、ENTRYPOINTやHEALTHCHECKなど応用的な命令や、スクリプトを使ったコンテナ起動制御について掘り下げていきます!

 
 

ブログランキングに参加しています。クリックして応援していただけると嬉しいです。

人気ブログランキング
ブログランキング・にほんブログ村へ
にほんブログ村