Dockerの仕組み〜技術の中を覗いてみた〜
わくばです!
夏が近づいているのを感じます。といっても僕みたいなタイプは通年性のインドアなので季節関係ないんですが。。。
今日はかねてより気になっていたDockerという仮想化技術について勉強しました。やっぱ低レイヤーの勉強って面白いですね。もともと性格がヲタッキーだからか、こういうギークな分野に惹かれるんですよね笑
Dockerの解説で、よくVM(仮想マシン)とDockerの比較みたいなのあるじゃないですか、こんな感じの
僕個人的にこういう画像しっくりこなくて、「Docker Engine」とか「Hypervisor」がある時点で比較になってないというか、理解のしようがないじゃないですか。VMの方はゲストOSがあるのでなんとなくわかるんですが、Dockerの方は何をやっているのやら、、、、
Dockerの定義
なので自分なりにDockerに関して調べてみました。まず定義ですが
「すべての依存関係をパッケージ化してコンテナとして動かす」
なるほど、これは初心者あるある。定義の中に知らない言葉があるパターンです。とりあえずコンテナを調べてみました。Wiki先生の引用です。
LXC(英語: Linux Containers)は、1つのLinuxカーネルを実行しているコントロールホスト上で、複数の隔離されたLinuxシステム(コンテナ)を走らせる、OSレベル仮想化のソフトウェアである。
Linuxカーネルがcgroupsという機能を提供を利用することで、リソース(CPU、メモリ、ブロックI/O、ネットワークなど)の制限と優先順位付けが可能になっており、そのために仮想マシンを使用する必要がない。また、名前空間の隔離機能を利用すれば、アプリケーションから見たオペレーティング・システムの環境を完全に隔離することができるため、プロセスツリー、ネットワーク、ユーザー識別子、マウントされたファイルシステムを仮想化することができる[2]。
なんとなくわかりました。「要は必要なもの(リソース)だけ取ってきて特別扱い(namespaceとして隔離)」をするということですかね。パッケージ化というのはおそらくdocker imageのことでしょう。
つまりコンテナはホストOSのプロセスの一部にすぎないと(ゲストOSがないので、ホストOSという言葉もないかもしれません)
コンテナと仮想マシンの根本的な違い
以上のコンテナの説明を鑑みると
コンテナ:プロセスの仮想化
VM:コンピュータまるごと仮想化
ということになると思われます。VMの方はパソコンの中で別のパソコンを動かしてるようなものなのでブートとかシャットダウンとかがありますが、コンテナは普段1つのパソコン上でやってることの一部を特別扱いしてるだけなのでそもそもブートとかの概念そのものがないんですね。故に処理が軽いかなるわけです。納得。
Docker deamonというのはこのコンテナとホストのKernelとのやり取りを仲介するシステムということで良さそうです。
Dockerのイメージ?レイヤー?
さて、最後に引っかかるのは「パッケージ化」、つまりDocker imageの部分です。Qiitaなどで見つけた説明では、Docker imageというのは複数のイメージレイヤーが積み重なってできており、コンテナを作成する設計図みたいなものだそうです。
Docker用語ではレイヤーと表現されていますが、UFS(Unix File System)による技術で、ファイルの集まりという認識で良さそうです。特にレイヤーと呼ばれるファイルシステムはお互いに親子関係を持ち、最終的にはファイルの集まり全体で1つのファイルとして機能・認識されるようです。逆にそうなるように親子関係が設計されているということですね。すげー笑
まとめ
DockerというのはホストOSのプロセスを仮想化する技術であり、Linuxのファイル技術をフル活用したモノなんですね。個人的にVMと根本的に違いすぎて比べる意味あるのかと感じてしまいました笑 「仮想化」の部分にフォーカスしましたが、この技術が普及した理由はコンテナ共有の簡便さにあったようです。チーム開発の現場は1ピコも知らないので実感はできませんが、エンジニアの世界は互換性・汎用性がかなり重宝されるようです。どこの世界もそうか笑
では。