inoino-blog
Docker imageの選択基準
2025-2-11

この記事は以下の記事の内容を改変・追記し自分なりにまとめたものです。

iconAlpine, Slim, Bookworm, Bullseye, Stretch, Jessie — Which Docker Image Should I Choose? | by Julie Perilla Garcia | Level Up Coding

DockerとLinuxのimage

DockerFileを作る時は、imageのもととなるimageを指定します。以下のようにbaseはnodeのimageをもとに、deployはnginx-alipineをもとに新しいimageを作成しています。

FROM node:22 AS base
WORKDIR /app
FROM base AS build
COPY ./vite-project /app
RUN npm install && npm run build

FROM nginx:1.27.3-alpine AS deploy
COPY --from=build /app/dist /usr/share/nginx/html

nodeとnginxとか便利なimageがたくさんあります。しかし、単なるLinuxディストリビューションを使用しようとするとその選択肢の多さに驚かされます。

alpine, slim, bookworm, bullseye, stretch, buster, jessie, slim-bookwormなどなど。どれだけあんだ!

これらのLinux達はOSの仕組みや初期にインストールされているライブラリが異なるわけで、不要なライブラリを多く含んだものを選択するとimageは大きくなるし、逆にRUNでimage作成中に大量のライブラリをインストールする羽目になる可能性がある。

結局はOSに何ができるのかを知らないと選択すらできないということになる。

Linuxディストリビューションの基本知識

そもそもLinuxディストリビューションに何があるかは知るべきなので、必要なものだけまとめる。

GNULinuxuTree.jpg

こんな感じでたくさんのバージョンがある。

Dockerの場合は

Debian alpine等が使われることが多そう。(経験談)

これらのLinuxを基本のimageとして、NodeとかWordpressとか公式のDockerFileが作られてる。

alpine

icon超軽量なAlpine Linuxについて調べた #Docker - Qiita

alpine Linuxは軽量なLinuxとして知られている。パッケージ管理はapkで行われる。

軽量なのでDockerのimageに採用されることがある。

Debian

iconDebianのバージョン履歴 - Wikipedia

DebianはDebian Projectらによって作成されているオペレーティングシステム。

Debianの各Versionには名前が付けられている。以下の通り.

Dockerのimageはこの名前がよく出てくるので最新のものがbookwormであることぐらいは知るべきだろう。

Versionname
8jessie
9stretch
10buster
11bulleye
12bookworm

Simple Tags と Shared Tags

docker の元imageを指定する際は、Simple TagsShared Tagsの二つがある。

これを詳しく理解するなら、Multi-pratform imageについて知る必要がある。

Multi-platform image

iconMulti-platform | Docker Docs

コンテナとホストの互換性問題

コンテナはDocker Engineが動いているホストのカーネルを共有する。そのため、コンテナ内で実行されるコードはホストのOS・アーキテクチャとの互換性がある必要がある。

windows/amd64のホストからlinux/amd64のコンテナを実行することはできない。

また、linux/amd64のコンテナをlinux/386で動かすことはできない。

互換性のあるimageじゃないと動かないので、適したimageを選択する必要がある。

WindowsでDockerを使う場合、Docker DesktopとWSLで環境構築するとLinuxカーネルで実行される。どうやらWindowsカーネルで実行する方法もあるらしい…

Multi-platform imageで互換性の問題を解決する

Multi-platform imageは複数のOS・アーキテクチャで動かせるimage。dockerはimageをPullするとレジストリからホストのOS・アーキテクチャに合わせたimageが取得される。

ちなみに**Multi-platform imageに対して、一つのOS・アーキテクチャで動かすimageはsingle-platform image**という

これをうまく使うことで、異なるタイプのハードウェアで同じイメージを実行できる。

Simple Tags

単一プラットフォーム専用のイメージ。Linux専用のイメージなど…

アーキテクチャの違いは吸収されていることに注意

Shared Tags

複数のプラットフォームやアーキテクチャ向けにビルドされたイメージの集合体

Docker Hubで様子を見てみる

pythonの公式イメージを見てみる。

iconpython - Official Image | Docker Hub

Simple TagsとShared Tagsの一覧がOverviewから見れる。該当するTagについてTagsの情報を見てみる

Simple Tagsの中身

iconpython Tags | Docker Hub

SimpleTags.png

3.14.0a4-bookworm を見てみるとlinuxの複数のアーキテクチャに対応したMulti-platform imageが見れる。Simple TagsだからSingle-platform imageであるわけではない。

Shared Tagsの中身

iconpython Tags | Docker Hub

sharedTags.png

3.14.0a4 を見てみると、3.14.0a4-bookworm と比較してWindows用のimageも追加で確認できる。

WindowsとLinuxの両方で使用できることがわかる。

選定基準

ビルド対象のプラットフォームが決まっている場合

Simple Tags

複数のプラットフォームで動作させる必要がある場合

Shared Tags

Full official image

python:3.11.4のような必要なツールやライブラリが全て揃っているもの。他のイメージはこのFull imageのサブセットで、後から不足しているツールを自前でインストールする必要がある可能性がある。

例えば、python:3.11.4-slimとか。

問題点

選定基準

開発環境でプロジェクトを素早く立ち上げる場合 → Full official image

prd環境にデプロイする場合 → その他のサブセットのimage

-bookworm / -bullseye / -stretch / -jessie

DebianのVersionが指定されている。

-[name]で Debian の各リリースのコードネームを示す。

選定基準

特定のVersionのDebianが実行環境として必要な場合 → Debianのリリース別イメージ

-slim image

フルイメージから不要な部分を削ぎ落としたバージョン。

Python や Node.js の場合、実行に必要な最低限のパッケージのみを含み、サイズが大幅に小さくなる。

動作中に不足しているツールが原因でエラーが発生する場合があるので十分なテストが必要になる。

選定基準

スペースに制約がある場合 → -slim image

-slim-bookworm / -slim-bullseys

Slim イメージと特定の Debian リリース(例:Bookworm, Bullseye)を組み合わせたもの。

-alpine image

とても小さいサイズのイメージ。ただ、Debianベースのパッケージとの互換性問題があり、Pythonの一部Wheelは再コンパイルが必要な場合がある。apkコマンドでパッケージを管理する。

-windowsservercore image

Windows や Windows Server 専用で動作するimage

イメージサイズの比較

imageSize.png

alpine-slim-bookworm-bookwormの順でサイズが大きくなっていることがわかる。