DockerコンテナにAlpineを使う理由
Dockerを使って開発していると、Alpine
や Debian
、Ubuntu
などのベースイメージを選ぶ場面があります。
でも、「そもそもDockerはLinux上で動いていて、コンテナもLinux上で動くのに、なんでまたAlpineとかUbuntuを中に入れるの?」という疑問が湧いてきました。
この疑問をきっかけに、Linuxのカーネルとユーザー空間は別物であるという設計思想を理解することができました。この記事では、その理解を整理して共有します。
最初の疑問
Dockerで環境構築をしていると、コンテナのイメージに FROM alpine
や FROM ubuntu
を指定することがあります。しかし、DockerはLinux上で動いているはずです。それなら、
「すでにLinuxがあるのに、なぜAlpineやUbuntuを追加する必要があるの?」
という疑問が湧いてきました。
カーネルとユーザー空間は別物
調べてわかったこと、Linuxには2つの空間があるということです。
空間 | 内容 |
---|---|
カーネル空間 | Linuxカーネルそのもの。プロセス管理やI/Oなどの低レベル制御を担当する「脳」 |
ユーザー空間 |
/bin , /lib , /etc など、アプリケーションやユーザーが使うツールが配置される「作業場」 |
アプリケーションは直接カーネルにアクセスできません。代わりに「システムコール」を使って、カーネルに依頼します。これ自体は理解していました。
Dockerの仕組み
DockerはホストOSのLinuxカーネルをそのまま使用し、ユーザー空間だけをコンテナごとに分離します。そのため、コンテナにはカーネルは含まれていません。
つまり、AlpineやUbuntuを入れる理由は、アプリが動作するために必要な最小限のツールセットを提供するためでした。
ここで、カーネル(システム全体を管理する部分)に対して、さまざまなユーザー空間のソフトウェアが存在し、それがディストリビューションであることが見えてきました。
ディストリビューションとは?
Linuxカーネルは多機能で、特定の用途に合わせて、どの機能を有効にするか、無効にするかを選ぶことができます。これにより、カーネルは非常に柔軟で、さまざまなシステムや用途に対応できるようになります。
Ubuntu、Alpine、Debianなどの「ディストリビューション」は、Linuxカーネルに加えて、どんなユーザー空間(アプリケーションやツール、ライブラリ)を含めるかを決めるものです。これにより、それぞれのディストリビューションが特定のニーズ(例えば、デスクトップ環境、軽量化、安定性重視など)に適した環境を提供します。
Dockerで使用する場合、通常、「ユーザー空間」だけを利用するイメージを使います。コンテナはホストOSのカーネルを共有するため、コンテナ内にはカーネル自体は含まれません。
まとめ
最初、ぼは「OSは1つの塊」だと思っていました。しかし、今では、カーネル(脳)とユーザー空間(道具箱)は分けられているのが当然だと理解できるようになりました。
Dockerは、この設計思想を活かして、1つのカーネル上で複数のユーザー空間を動かすという軽量で効率的な仕組みを実現していると理解することができました。