はじめに
株式会社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 公式イメージには、アプリケーションが正しく動作するために必要なすべてのソース コード、コア依存関係、ツール、およびライブラリが含まれています。
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無料版で翻訳)
node:<version>-slim
FROM node:24-slim
- Debianベース(Bookworm)
- Node.jsの実行に最小限のパッケージのみ
- イメージサイズを抑えたい場合に使用
- 追加パッケージが少ない場合に使用
補足:Debianのコードネーム
bookworm、bullseyeなどは、Debianのバージョンを示すコードネームです
| コードネーム | Debianバージョン | 状態 |
|---|---|---|
| bullseye | Debian 11 | 以前の安定版 (LTS: 2026年8月まで)) |
| bookworm | Debian 12 | 以前の安定版(LTS: 2028年6月まで) |
| trixie | Debian 13 | 現在の安定版 |
ちなみに、コードネームは「トイ・ストーリー」シリーズのキャラクターに基づく名前が付けられているようです💫
イメージサイズ
ベースイメージの種類の紹介でサイズについて触れましたが、イメージサイズが小さいと何が嬉しいのでしょうか。
イメージサイズが重要な理由
イメージサイズを小さくすることでビルド時間が短縮され、デプロイが高速化され、攻撃対象領域が最小化されます。
(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やライブラリを確認する
- イメージのサイズを確認する
おわりに
ここまで読んでくださりありがとうございます!🎁
明日の記事は、昨年のアドベントカレンダーでもバトンタッチをした きむら さんです✨✨
弊社ではエンジニアを募集しております!少しでもご興味がありましたら、カジュアル面談でお話ししましょう!