DockerでPythonやRubyなど各言語のイメージを選ぶときに、alpine, buster, slim, stretch, jessie, slim-buster, windowsservercore, latestなど選択肢がたくさんありすぎて、どれを選べばいいのか、、と迷うことがあると思います。
ここでは、alpine, buster, slim, stretch, jessie, slim-buster, windowsservercore, latestなど、それぞれの違いやメリット・デメリット、どういった場合にどれを選ぶべきかをまとめています。
例:docker hubに用意されているRubyのイメージ
各バージョンのイメージに対したくさんのタグが用意されています。
alpine, bullseye, buster, stretch, jessie, latest, Windowsの違い
まず各タグは、イメージを構築しているOSごとに大きく4つに分けることができます。
- 公式のパッケージ
- Alpine Linux
- Debian
- Windows
Alpine LinuxとDebianは、Linuxをベースに作られたOS((Linux)ディストリビューションといいます)です。
Debianは昔から広く普及しているものです。Alpine Linuxはシンプル・軽量を目的に新しく(2010年)つくられたものです。
公式のパッケージ
公式のパッケージは、2.7.4や3.0など、バージョンをそのまま指定するものです。
タグを指定しない場合は、latest と同じ状態となり、公式の最新版のイメージになります。
タグ | 内容 |
---|---|
3.0.1 | パッチまで指定。指定したバージョンをインストール。 |
3.0 | マイナーバージョンまで指定。パッチは指定しない。最新のパッチになる |
3 | メジャーバージョンのみ指定。マイナーバージョンとパッチは最新になる |
latest | 最新バージョン。※buildの度に常に最新のバージョンを使う。依存性に注意が必要 |
指定なしの場合は、latestと同じ。 |
Alpine Linux
軽量重視で作られたLinuxディストリビューションです。
イメージのファイルサイズがとにかく小さいです。
ただし、Pythonなど一部の言語などでは速度が遅くなるなどのデメリットがあるので使用を推奨していない場合があります。
Debian系のUbuntuなどではパッケージの管理にaptコマンド
を使いますが、Alpine Linuxはapkコマンド
を使います。
軽量版なので必要なパッケージやライブラリがない場合があります。その時は都度インストールする必要があります。
ディストリビューションのパッケージ管理コマンド
パッケージ管理ツール | ディストリビューション(OS) | 意味 |
---|---|---|
apk | Alpine Linux | Alpine Linux package management |
apt | Debian系ディストリビューション(Ubuntuなど) | Advanced Packaging Tool |
apt-get | aptに統合。Debian系ディストリビューション | |
yum | Red Hat系のディストリビューシュン(CentOSなど) | Yellowdog Updater Modified |
Debian
Debianは(Linux)ディストリビューションの一つです。
無料で配信されています。広く普及していて安定して使うことができます。
バージョンごとにコードネームがつけられていて、Dockerイメージのタグにはそのコードネームが使われています。
コードネーム | バージョン | 読み方 |
---|---|---|
bullseye | v11 | ブルズアイ |
buster | v10 | バスター |
stretch | v9 | ストレッチ |
jessie | v8 | ジェシー |
Windows
windowsservercoreはWindows専用のサーバーOSで構築されています。
コンテナをWindows環境にしたい場合はこれを使います。
Slimのありなしによる違い
OSの種類の違い以外に、もう一つの軸として、Slimがつくかつかないかの違いがあります。
Slimがつくと、その名の通り、使用頻度の低いツールやライブラリを除外したスリムなDockerイメージになります。
必要なライブラリやツールは、その都度自分でインストールする最小構成です。
Slimが用意されているのは、公式バージョンとDebian系です。
3-slim, 3.0-slim, 3.0.1-slim, bullseye-slim, buster-slimというように指定します。
Dockerイメージの主なタグ一覧
タグ | 内容 | OS |
---|---|---|
latest | 最新のフルパッケージ。 | |
slim | 使用頻度の低いツールやライブラリを除外した最小パッケージ。 | |
alpine | シンプル軽量なAlpine Linuxベースで構築された超軽量イメージ。 | Alpine Linux |
bullseye | Debian11で構築されたイメージ。 | Debian(v11) |
bullseye-slim | Debian11で構築されたイメージ。使用頻度の低いツールを除外した最小パッケージ。 | Debian(v11) |
buster | Debian10で構築されたイメージ。 | Debian(v10) |
buster-slim | Debian10で構築されたイメージ。使用頻度の低いツールを除外した最小パッケージ。 | Debian(v10) |
stretch | Debian9で構築されたイメージ。 | Debian(v9) |
stretch-slim | Debian9で構築されたイメージ。使用頻度の低いツールを除外した最小パッケージ。 | Debian(v9) |
jessie | Debian8で構築されたイメージ。 | Debian(v8) |
jessie-slim | Debian8で構築されたイメージ。使用頻度の低いツールを除外した最小パッケージ。 | Debian(v8) |
windowsservercore | Windows用サーバー系OSで構築したイメージ。 | Windows |
どのイメージを選ぶべきか?
公式パッケージを選択するのはどんなときか?
容量の制限がない場合や、マルチビルドなど一部の必要な情報のみ抜き出したい場合、本番環境とする場合は公式のフルパッケージを選択します。
バージョンが新しすぎるとバグが出る可能性があるので、安定版にしておくのが無難です。
また、バージョンが古すぎたり、新しすぎたりすると、ライブラリやツールによっては対応していないことがあるので、必要やライブラリやツールが対応しているバージョンを選択する必要があります。
「latest」はビルドの度に最新のイメージをベースに構築することになるので、おすすめできません。(タグ指定なしも)
Slimを選択するときはどんなときか?
Slimは使用頻度の低いツールやライブラリを除外した最小パッケージなので、使うツールやライブラリが少ないことがわかっている場合に選択すると便利です。
Linux Alpineを選択するときはどんなときか?
Linux Alpineは高速で容量がかなり抑えられていてかつ、Slimよりも必要なパッケージが入っています。
ただし、Debian系をベースに作られているパッケージとの互換性がなかったり、主要なパッケージが不足している場合があります。(パッケージは後から追加することができます)
容量を抑えてテストをしたい場合や、将来的にもパッケージをあれこれと追加することがない小さなプロジェクトには使えます。
Linux Alpineでエラーが出る場合は、公式に切り替えて実行するのが一つの解決策です。
Debianを選択するときはどんなときか?
Debianはバージョン毎にコードネームで選択することができます。
本番環境として構築する場合に、特定のDebianのバージョンでバグが出ることがわかっている場合や、環境が指定されている場合にはそれにあったコードネームを指定します。
windowsservercoreを選択するときはどんなときか?
Windows環境で構築したい場合はwindowsservercoreを使います。(あまり聞いたことがないですが、、)
目的別で選ぶ場合
本番にする予定がなく、サクッとテストしたいときは、SlimかAlpine。
本番化する予定がある場合は、公式パッケージの安定版かバージョンを指定。使うパッケージが少なく将来増えない場合はSlimを使のがいいかと思います。
参考
- Wikipedia Linuxディストリビューション
- Wikipedia Alpine Linux
- Wikipedia Debian
- 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 ディストリビューション (distribution)
- Start it up Alpine, Slim, Stretch, Buster, Jessie, Bullseye — What are the Differences in Docker Images?
なお、各イメージをどう使うかはDocker hubの各イメージページの下の方に記述があります。
ruby:<version>
これは事実上の画像です。ニーズがわからない場合は、おそらくこれを使用することをお勧めします。これは、使い捨てコンテナ(ソースコードをマウントし、コンテナを起動してアプリを起動する)としても、他のイメージを構築するためのベースとしても使用できるように設計されています。
これらのタグの中には、バスターやストレッチなどの名前が付いているものがあります。これらはDebianのリリースのスイートコード名であり、イメージがどのリリースに基づいているかを示します。イメージに付属しているもの以外の追加パッケージをイメージにインストールする必要がある場合は、Debianの新しいリリースがあるときの破損を最小限に抑えるために、これらのいずれかを明示的に指定することをお勧めします。
このタグはに基づいていbuildpack-depsます。buildpack-depsシステム上に多くのイメージを持っているDockerの平均的なユーザー向けに設計されています。設計上、非常に一般的なDebianパッケージが多数含まれています。これにより、イメージから派生したイメージをインストールする必要があるパッケージの数が減り、システム上のすべてのイメージの全体的なサイズが縮小されます。
https://hub.docker.com/_/ruby
ruby:<version>-slim
このイメージには、デフォルトタグに含まれている一般的なパッケージは含まれておらず、実行に必要な最小限のパッケージのみが含まれています
https://hub.docker.com/_/rubyruby
。あなたは環境で作業している場合を除きだけruby
画像が展開され、あなたは、スペースの制約があり、我々は非常にこのリポジトリのデフォルト画像を使用することをお勧めします。
ruby:<version>-alpine
このイメージは、公式イメージで入手可能な人気のあるAlpineLinuxプロジェクトに基づいています。Alpine Linuxは、ほとんどのディストリビューションベースイメージ(〜5MB)よりもはるかに小さいため、一般にイメージがはるかにスリムになります。
このバリアントは、最終的な画像サイズをできるだけ小さくすることが主な関心事である場合に役立ちます。注意すべき主な注意点は、glibcやその仲間の代わりにmusl libcを使用するため、libcの要件/仮定の深さによっては、ソフトウェアで問題が発生することがよくあるということです。発生する可能性のある問題の詳細と、アルパインベースの画像を使用した場合の賛否両論の比較については、このHackerNewsのコメントスレッドを参照してください。
画像サイズを最小化するために、追加の関連ツール(
https://hub.docker.com/_/rubygit
またはなどbash
)がアルパインベースの画像に含まれることはめったにありません。このイメージをベースとして使用して、必要なものを独自のDockerfileに追加します(慣れていない場合のパッケージのインストール方法の例については、alpine
イメージの説明を参照してください)。