🛠️

dockerのコンテナイメージの種別についてのまとめ

2024/12/08に公開

どうも。
新しいMacが欲しい。メモリ16GBじゃ辛くなってきた。でも36GBのMacBook Proとか30万以上するしなぁ、、個人で使うんなら持ち運びとか滅多にしないしmac miniでもいいかな、、などと考えているよこやんです。

みなさん。、業務でdocker使っていますか?使っていますよね。
おっさんエンジニアとしては20年前とかの環境設定の手間はなんだったのか、と思いたくなるほどに便利なプラットフォームです。
なんといっても会社などのチームで開発していると、全員が同じ環境設定で開発できるというのは大きいです。大昔のAさんの環境では動くけど、Bさんの環境では動かない、みたいな悩ましい問題は滅多に起こらなくなりました。(ゼロとは言ってない)
しかし環境共通化できることに伴い、個々人が環境設定をする機会が減り、誰かが作ってくれたものをなんとなく雰囲気で使ってる、みたいな人も多いんじゃないかと思います。
かくいう私もそんなところはありました。
本記事ではその反省のため、まずdockerのコンテナイメージについてまとめたいと思います。
いろんな資料を見ながら自分なりの解釈も入れてまとめているので間違ってたらゴメンナサイ・・・

Docker コンテナイメージの種類

主要なところだと以下のコンテナイメージが有名です。

Alpine Linux

概要

Alpine LinuxはDockerコンテナ用に最適化された軽量のLinuxディストリビューションです。
セキュリティ、シンプルさ、リソース効率を重視した設計となっており、標準Cライブラリのmusl-libcと後述のコンテナBusyBoxをベースに構築されています。

メリット

イメージサイズが小さい(約7MB)ためダウンロードや転送が速くなり、ひいてはCIやサービスインの高速化が可能となる
apkというパッケージマネージャーを使用している

デメリット

musl-libcはglibcの軽量版でありますが、完全な互換性はありません。よって特に一部のアプリケーションで動作しなかったり、パフォーマンスが悪くなる場合があります。

ちょっと前の記事になりますが、このような記事も見つけました。
https://blog.inductor.me/entry/alpine-not-recommended
動かすアプリケーションによってはちょっと癖みたいなものが出てくるかもですね。

利用シーン例

軽さと機能面をある程度両立させたいとき。でも痒いところに手が届かなかったり、癖に悩まされることもあるかも??

また、こんな記事も見つけたので工夫次第でなんとかなるのかもしれませんね。(そこまでコストかけるなら別の使うよってのもあると思います)
https://qiita.com/dojyorin/items/5a53b6eed77803d558ed

Ubuntu

概要

有名なLinuxディストリビューションであり、人気と実績を兼ね備えたOSです。そのため豊富な情報とコミュニティサポートがあります。

メリット

上記したように困ったときの情報が豊富ですし、glibcを使用しているので広範囲な互換性があります。

デメリット

なんといってもその重さです。(75MB程度?)プル/プッシュの時間が比較的長くなる可能性があります。

https://jfrog.com/ja/devops-tools/article/why-use-ubuntu-as-a-docker-base-image-when-alpine-exists/

利用シーン例

至れり尽くせりな反面ネックとなるのはその重さ。学習用途か、使用したいライブラリの互換性の問題でどうしても、というケースでしょうかね?

CentOS

概要

こちらも有名です。
Red Hat Enterprise Linux(RHEL)との互換性を目的としたLinuxディストリビューションです。

メリット

エンタープライズ環境での使用に適しています。
RHELとの互換性があります。

デメリット

こちらも重いです。。

利用シーン例

ubuntu同様、学習用か、互換性か、この辺りの理由がなければあえて選ばないかな・・・

Busybox

概要

BusyBoxは、UNIX系オペレーティングシステムで広く使用される軽量なツールボックスであり、多くの標準的なコマンドを一つの実行ファイルにまとめたツールです。
にもかかわらずサイズも小さく抑えることに成功しています。

メリット

その軽さです。
元々Busybox自体は組み込み系などに利用されていたようで、必要最低限の機能しか提供されていません。

デメリット

必要最低限すぎて、パッケージマネージャなども持っていないため使い回しの面ではかなり苦労すると思います。
webサービスの構築などを目的としている場合、ちょっと頼りないかな。。。

利用シーン例

その軽量性と効率性から多くの場面で重宝されており、特にリソース制約がある環境で非常に有用です。
またdockerコンテナのベースとして作られることもあり、上述したAlpineなんかもBusyboxをベースに作られています。
とはいえ、、、やはり用途は限定的。

scratch

概要

空っぽのコンテナです。全てのコンテナイメージの大元になります。

メリット

その軽さ。実質0です。
全てのシステムを完全にカスタマイズできる猛者であれば、ありでしょう。私は絶対無理。

デメリット

基本的なツールや機能が一切含まれていないため、すべてを自前で用意する必要があります。

利用シーン例

なんでしょうね。。ほんとにゼロから作りたい人向けでしょうか。。。

Distroless

概要

Googleが開発した非常に軽量でセキュアなDockerコンテナイメージです。
アプリケーションの実行に必要な最小限のファイルとライブラリのみを含んでいます。

メリット

その軽さと必要最低限、そしてある程度の利便性のバランスをとっています。
GoやRustでビルドされたアプリケーションの実行に向いているようです。
また、不要なファイルや機能を排除することで、不要なバグや脆弱性のリスクが低減され、攻撃対象領域を狭めています。

デメリット

こちらもシェル環境やパッケージマネージャーが含まれていないため、開発やデバッグが難しくなる可能性があります。

利用シーン例

メリットに書いたようにGoやRustの実行環境に向いているようです。
反対にRailsなど、運用上コンテナの中に入ってバッチ処理がやりたい、などの運用はできないためそういった利用シーンがある場合は向いていないと思います。

amazonlinux 2

概要

AWSが提供するLinuxディストリビューションであり、特にAWS環境での使用に最適化されています。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/amazon_linux_container_image.html

メリット

AWSサービスとの親和性が高く、EC2やECSなどでの運用が容易です。AWS CLIやSDKも標準でインストールされています。

デメリット

まぁそれなりに重いですね。

利用シーン例

AWS上で動作するアプリケーションやサービスを開発する際に最適です。特にEC2インスタンスやECSクラスターでの利用が一般的です。
RailsとかをAWSで稼働させるなどであれば、こちらが選択肢に上がってくるのかな?

まとめ

改めて調べてみるとそれぞれのコンテナに特徴があって面白いです。これを脳死で使うのは勿体無いかも。
とはいえ本記事で「メリット」「デメリット」をちゃんと洗い出せたのか、ちょろっと調べたくらいじゃ追いつかず、書いていて心配になるレベルでした。
それぞれのコンテナを実際に使ってみてどうか、みたいな記事も書いてみたいと思いました。(他に書きたいネタがあるので、また後日・・・)
まぁ、本記事は「へぇ、こんなのあるんだ」くらいの動機づけくらいになってくれれば幸いです。

そういや、新しいMacが欲しい理由は個人開発で作っているシステムが10個くらいコンテナを動かしている関係で常にメモリを圧迫している、というものだったのですが、コンテナイメージを見返すことでまだ戦えるかも。。。なども思ったりもしました。

Discussion