iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

Node.js × Docker ベースイメージをどうやって選ぶか

はじめに

株式会社iimonエンジニアのかとうです!

本記事はiimonアドベントカレンダー17日目の記事です!🎁

今まで主にフロント業務をしていましたが、最近はサーバーサイドやインフラ寄りの開発など幅広い領域に取り組ませてもらっています🥲🎄✨

DockerでNode.jsアプリケーションをコンテナ化する時、最初はAIにDockerfileを生成してもらいました。ベースイメージに種類があることを知り、そのベースイメージってどうやって選択したんだろう、、と疑問に思いました。

ベースイメージとは何かさえわからなかった私が、ベースイメージの種類について調べて、どのように選択するかを解説します!🐳

Docker イメージとは

コンテナイメージとは、コンテナを実行するために必要なすべてのファイル、バイナリ、ライブラリ、設定を含む標準化されたパッケージです。

(DeepL無料版で翻訳)

What is an image? | Docker Docs

Node.js Docker公式イメージとは

Node.js公式Dockerイメージは、Docker Hub で提供されています。

Node Docker 公式イメージには、アプリケーションが正しく動作するために必要なすべてのソース コード、コア依存関係、ツール、およびライブラリが含まれています。

ノードドッカーの公式イメージの使用方法 | Docker

Node.jsの公式Dockerイメージを使用すれば、nodeをインストールしたり、依存関係を設定する必要がなくなります。

Node.js Dockerイメージの種類

node:<version>

FROM node:24
  • Debianベース(Bookworm)
  • buildpack-deps をベースにしていて、多くのパッケージを含んでいる
  • イメージのサイズが大きい
  • ニーズが不明確な開発時に使用

FROM node:24 と指定すると、実際には以下のようになっています。

FROM buildpack-deps:bookworm
ENV NODE_VERSION 24.12.0

docker-node/24/bookworm/Dockerfile at main · nodejs/docker-node · GitHub

node:24というタグは、現在ではnode:24.12.0-bookwormの別名です。

マイナーバージョンが固定されていないため、今後24.13.0などに変わる可能性があります。なので、必要に応じてバージョンを固定すると良さそうです。

Docker Hub の サポートされているタグ一覧の枠内は違う表記ですが、中身は同じイメージです。リストのまとまりになっているものは同じイメージを表します。

また、bookworm も同じように今後変わる可能性があるため、追加パッケージをインストールする必要がある場合は、FROM node:24-bookwormのように明示することが推奨されています。

node:<version>-alpine

FROM node:24-alpine
  • Alpine Linux ベース
  • node:<version> よりもサイズが小さい
  • イメージのサイズを可能な限り抑えたい場合に使用

node:<version>-alpineはサイズが小さくて魅力的ですが、使用されているベースOSとライブラリの違いに注意が必要です⚠️

Alpineは一般的なglibcではなくmusl libcを使用しています。これによりサイズが小さくセキュリティが向上する一方で、特定のアプリケーションとの互換性の問題が生じる可能性があります。

(DeepL無料版で翻訳)

https://cimpleo.com/blog/alpine-busybox-and-debian-docker-images-a-comprehensive-guide/

node:<version>-slim

FROM node:24-slim
  • Debianベース(Bookworm)
  • Node.jsの実行に最小限のパッケージのみ
  • イメージサイズを抑えたい場合に使用
  • 追加パッケージが少ない場合に使用

補足:Debianのコードネーム

bookwormbullseyeなどは、Debianのバージョンを示すコードネームです

コードネーム Debianバージョン 状態
bullseye Debian 11 以前の安定版 (LTS: 2026年8月まで))
bookworm Debian 12 以前の安定版(LTS: 2028年6月まで)
trixie Debian 13 現在の安定版

DebianReleases - Debian Wiki

ちなみに、コードネームは「トイ・ストーリー」シリーズのキャラクターに基づく名前が付けられているようです💫

イメージサイズ

ベースイメージの種類の紹介でサイズについて触れましたが、イメージサイズが小さいと何が嬉しいのでしょうか。

イメージサイズが重要な理由

イメージサイズを小さくすることでビルド時間が短縮され、デプロイが高速化され、攻撃対象領域が最小化されます。

(DeepL無料版で翻訳)

Optimizing Docker Images for Size and Security: Best Practices for DevOps | by Mr__Scalpel | Medium

Dockerfile作成のベストプラクティスにも、サイズが小さいことを確認するように記述があります🐳

イメージサイズの確認

実際にイメージをプルしてサイズを確認してみました。

イメージのプル

docker pull node:24
docker pull node:24-slim
docker pull node:24-alpine

サイズの確認

docker images node

イメージサイズ一覧

イメージ サイズ
node:24 1.61GB
node:24-slim 343MB
node:24-alpine 226MB

イメージサイズが大きいということは、必要のないパッケージが含まれている場合があります。サイズが小さいことで、依存関係における脆弱性の数を最小限に抑えられます。

サイズはイメージを選択する上で重要なことですが、サイズはあくまでも一つの指標と考えるのが良さそうです。ライブラリとの互換性やセキュリティなど考慮して選ぶ必要があります。

ベースイメージの選び方

  • まずは、node:<version>-slim を検討する
  • イメージサイズが最優先の場合はnode:<version>-alpine
  • 開発、ビルド環境であればnode:<version>

ポイント

  • イメージのベースOSやライブラリを確認する
  • イメージのサイズを確認する

おわりに

ここまで読んでくださりありがとうございます!🎁

明日の記事は、昨年のアドベントカレンダーでもバトンタッチをした きむら さんです✨✨

弊社ではエンジニアを募集しております!少しでもご興味がありましたら、カジュアル面談でお話ししましょう!

iimon採用サイト / Wantedly

参考