Dockerは何を解決するのか?
Dockerとはオープンソースの次世代仮想化技術で、アプリケーションを「コンテナ」にパッケージングして、デプロイ、実行できます。
Go言語で書かれていてLinuxカーネルのみに依存する
ポイント
- コンテナにアプリをパッケージングして、デプロイ、実行までできる
- 1度ビルドすればどこでも動く
- Dockefileさえあれば、いつでも再現可能
- Go言語で書かれている
つまり
DockerfileにOSのスクラッチイメージからライブラリ、環境変数などのパッケージングするものを書きます。それをビルドして実行してテストしてデプロイするだけで、手元で動いていたものをプロダクション環境にそのまま持って行って動かすことができる
端的に言うと、
デプロイの作業が簡単になる
Docerfileによってインフラをコード化。(この点はVagnrantと類似している。)
Dockerはコンテナ型仮想化
仮想化なのでプラットフォームやハードウェアからは隔離された環境
すべてのコンテナには固有のIDがあります。
Dockerfileの1行ごとにコンテナとコンテナIDが作られ、コンテナは親からの差分を保存していく。例えば一番ベースとなるコンテナからapt-getなどをすると、その差分だけを保存することになります。何かに失敗したらgitのように失敗する前に戻すことが可能
Docker | Vagrant |
---|---|
コンテナ型仮想化 | ホスト型仮想化 |
物理マシンのLinuxカーネルは共有して、別々のユーザー空間を作り出すというアプローチ | 物理マシンの上の仮想空間に独自のLinuxカーネルやOSなどを作成(インストール)する |
ビルドもデプロイも高速、オーバーヘッドも少ないので動作が軽い | 逆に重い(左記に比べて) |
サーバ側の設定
DBインストールとかもろもろのアプリのインストール、サーバー側の設定については以下のとおり。
Docker | Vagrant |
---|---|
Dockerfile | シェル or Chef in Vagrantfile |
※Dockerでコンテナをして、Chefでサーバー設定も可能だが、Dockerfile自体がサーバーの設定を記述して自動化する機能を提供しているためあまり意味がない。
Docker | Vagrant with Chef |
---|---|
プロセス内でその仮想環境が構築され、そのプロセスを消すと仮想環境自体もなくなるため基本的には毎回一からDockerfileを使って仮想環境を構築する | chefのメリットのひとつに冪等性があるが、それはすでにサーバーの設定が入っているところに何度も実行しても環境が同じであることを保証したいするため |
VM(仮想マシン)とコンテナの違い
VMではVMごとにゲストOSがあって、その上にライブラリとアプリが乗っている。
コンテナではホストOSのうえにDockerエンジンがいて、そこに各種ライブラリがいる。
要は、コンテナが同じライブラリを共有しているので少ディスクスペースかつ少メモリ、それでいて隔離されている環境を実現できる。
上記を踏まえてDockerでまずは環境構築をしてみる。