dockerとvagrantの違い言える?新人エンジニアでも分かった気になれる俺流まとめ
「vagrantでいいじゃんっ」
「dockerでいいじゃんっ」
今やそんな言葉も絶え間なく聞こえる大仮想化時代。
私はどちらかといえば、dockerでいいじゃん派でした。
具体的に何がどう違うとか深く考えず、ただひたすらに流行に乗ってるだけでした。
「VirtualBoxでVagrantを動かす大まかな体系図はわかったけど・・」
「Dockerてイメージできないんですよね、何かいい例えないですか?」
そんな友人のセリフを聞いて、自分は何もわかっていないと思った。
・・・ということでだれでもわかる仮想化技術(?)の例えを作ることにした!
- 仮想化について、docker、vagrantを例えてみる
- 詳しくdockerとvagrantの違いを見る
- プロセスについて
- docker tool-boxについて
- dockerの仕組み
- その他・書籍/本
仮想化について、docker、vagrantを例えてみる
とりあえず下記の表をずらっと
仮想化技術/ツール/ハード | 例え | 意味/内容 |
---|---|---|
PC/端末/ホストマシン | 土地 | あらゆるリソースのもと |
VirtualBox,VMware,Hyper-V | 家の骨組み、外側(内側もあり) | 土台になるもの、これがないと成り立たない |
Vagrant | 家の内装、全体的な設計 | どんな室内構造か、部屋は何があるのか~その他 |
Docker | 部屋or(キッチンも可) | 様々な種類がある、場合によってば独特な空間を持ち合わせている |
Chef/Ansible/Puppet | インターネット会社/○○運用会社 | 家と家などの回線をつなぐ。様々なシステムを最適化、面倒みてくれるやつら |
AWS/EC2 | マンションの1室 | 家と似て、買えば何でも出来る(ただし制約はある) |
細かい突っ込みは置いといて、フィーリングだとか概要を掴むためにみてください。
まず最初に、仮想技術には「型」というのが存在します
- ホスト型
- ハイパーバイザー型
- コンテナ型
それぞれの内容について記事終盤にて書きますが。
vagrantはホスト型に属し(厳密には違う気が・・)
dockerはコンテナ型です。
この時点で違う。
それでは先程の表の例えを使ってもうちょっと細かく書いていきます。
PC/端末/ホストマシン
表では「土地」というように例えました。
土地が広ければ大きいお家も、マンションでも立てられます
土地にはCPU,メモリ、ストレージといった様に限られているリソースがあります。
仮想化を実現してるサーバー等が過剰にスペックが高かいのはリソース供給量を上げるためが理由の一つです。
VirtualBox,VMWare等
仮想化を実現するにはまず骨組みや土台があります。それらは最低限かつ必須のツール/機能なのです。
windowsユーザーであればtask-managerのCPUタブから「仮想化:有効/無効」(Hyper-V)があります。
macはわかりません。LinuxだとKVMがそれにあたります。
Vagrant
内装、家の全体構造の設計から構築を担うものです。
vagrantはホスト型に入りますが、正確には「設定ツール」のほうが近いです。
"immutable infrastructure"って言葉の横にはvagrantとdockerがあるのは
Vagrantfile(設計図)を使うことによってどの「土地」でも同じ構造の「家」が構築可能になるからです。
どこに部屋を作るか(fileマウント)、様式(OS)にするか和式(OS)にするか実現方法、電話内線(privateIP)はどうするか・・自由ですね
Docker
dockerはコンテナだの良く聞くかと思います。
ここでは部屋に例えます、しかも鍵付きです。
複数の部屋があるとしてもそれらはお互いには無干渉です。
例えば大きい「家」に「部屋(コンテナ)」を3つ作ります。
A部屋 (Webサーバー)、B部屋 (キャッシュサーバー)、C部屋 (DB)
そしてそれぞれの部屋を繋ぐ隠し通路(ネットワーク)を用意する事も出来ます。
その気になればそれを一瞬で壊して、作り直すこともできます。
ドラ○もんの道具/間取り図/設計書 (dockerfile)を使えば他人家にそのまま「部屋ごと」持っていく事も出来ます。
詳しくdockerとvagrantの違いを見る
上記の図と、先ほどの例えの表を思い出してかんじてください。
まず①にPCがあります。
④例えにもあった部屋、dockerコンテナです
A.この矢印はdockerコンテナ同士を繋ぐネットワークです(隠し通路)
# こんなコマンドかと $ docker run -d -p 8080:80 --name website --link database:db apache
- B) PC自体のファイルを作った仮想環境にマウント(読めるよう)する
- C) vagrant環境の場合だとここでもう一度dockerに向けてマウントします
- D) について公開するポートのマッピングです。BとCで実施した流れと一緒です。
DのところにChefがありますが、puppetやansibleはここら辺のサーバー間、その他の設定と自動化を行ってくれるものです。
Jenkinsとかもここにすんなり入りますね、ちょうど執事だし。なんでもしてくれます。
プロセスについて
プロセスとはざっくり言えばマシン上で行われている「処理」の事です。
ソフトウェアの世界では、OSからメモリ領域などの割り当てを受けて処理を実行しているプログラムのことを言う。OSの機能の一部を実行するシステムプロセスと、ユーザの指示で実行されるユーザプロセスがある。
プロセスは必要に応じて別のプロセスを起動することができ、起動した側のプロセスを親プロセス、された側のプロセスを子プロセスという。
ここまでの説明では
vagrant は仮想環境をの土台、構造を担う設計のようなものです。
dockerの場合は仮想環境上(Linux上)でのみしか動きません。
vagrantはOS単位を仮想化しているためリソース消費量は高いです
dockerは正確にはlinuxの機能*1を借りてるため、必要リソースは少く起動が早い
vagrantは仮想に必要なものを用意していきます、そのため実際のサーバー環境に一番近い形が実現可能となります。
dockerのみでは動くことはできません、ただし環境があれば何処でも動きます。起動が早く使い捨てや、テストに向いてます。
vagrantは家の設計。仮想環境が家そのもの。家の中には動いているプロセスは複数あり。
dockerは部屋。家の中プロセスの一つ、しかし部屋の中での自由度は高い。
なるべくむずかしい言葉を使わず説明しようとしたら
余計にわからなくなるパターンな記事ですなこれは。
それでも、少しでも伝わればと思います。
ありがとうございました。
下記の続きは個人的なメモとか、なぐりかきメモです。
docker tool-boxについて
dockerにはdocker tool-boxというのがあります。
一応docker社はdocker tool-boxをリリースしております。
さんざん図とかで説明している青色の箱(仮想マシン)がそのままdocker-machineになります。
今でもそうですがdocker用に用意されているOS?にboot2docker等があります。
dockerの仕組み
これは今でも説明が苦手ですが主に2種類の技術キーワードがあります。
- LXC
- AUFS
上記の二つです。(ググれば終わってしまいそうな内容だ)
LXC はlinux containers,Linuxのコンテナ技術です。
別に新しい別けではなくて、昔からあるみたいです。
LXCのポイントは cgroups ではなく namespaces を使用していること。
もう単語とかなんじゃそりゃですよね。僕も思いました。
cgroupsはcontrol group の略で、グループ化した複数プロセスを共通管理すること。
メモリだったりCPUを割り当てたりします。
それにたいしてnamespaces(名前空間)は単一のプロセスを持てること。
正直これの説明めんどくさい。
ホストマシン | dockerコンテナ | 内容 | |
---|---|---|---|
プロセスID | 512 | 1 | ホストでは512番目のプロセスとして認識されていても、コンテナ内では1番目のプロセス |
ユーザ | 一般ユーザ | rootユーザ | 隔離空間なのでrootユーザがデフォだったり |
もっとわかりやすい記事の努力をしよう、うん
その他・書籍/本
*1:LXCやAUFS