- 会員限定
- 2014/05/14 掲載
Dockerは何を解決するのか? VM(仮想マシン)との違いとは
Docker Meetup Tokyo #2
今からでも間に合うDocker基礎
株式会社トップゲートの森和之(@mainyaa)です。手元の開発環境では動いていたプログラムが、プロダクション環境にデプロイしてみたら動きませんでした、というのは誰でも経験すると思います。
環境変数が違っていたり、実行環境のバージョンやライブラリのバージョンが違ったり。しかしプロダクションの環境にログインしてこれらを操作する、ということはやりたくないですよね。
また、Amazon Web ServicesやさくらインターネットのVPSなどいろんな実行環境があって、でも特定の環境にロックインされないようにするにはどうすればいいでしょうか。
そのためにDockerがあります。
Dockerは何を解決するのか?
Dockerとはオープンソースの次世代仮想化技術で、アプリケーションを「コンテナ」にパッケージングして、デプロイ、実行できます。Go言語で書かれていてLinuxカーネルのみに依存します。
Dockerが何を解決するのかというと、デプロイの作業をもっと手軽にしようということです。
DockerfileにOSのスクラッチイメージからライブラリ、環境変数などのパッケージングするものを書きます。それをビルドして実行してテストしてデプロイするだけで、手元で動いていたものをプロダクション環境にそのまま持って行って動かすことができます。
つまりDocerfileによってインフラをコードとして扱えるんですね。
Dockerはコンテナ型仮想化を実現するのですが、仮想化と言ってもVirtualBoxとかVMwareなどの仮想化とは違っていて、コンテナ型仮想化はビルドもデプロイも高速、オーバーヘッドも少なく、しかし仮想化なのでプラットフォームやハードウェアからは隔離された環境となります。
問題が起きたときもDockerは威力を発揮します。本番とまったく同じコンテナを手元で動かせるので、ローカルでテストができます。
すべてのコンテナには固有のIDがあります。
Dockerfileの1行ごとにコンテナとコンテナIDが作られ、コンテナは親からの差分を保存していきます。例えば一番ベースとなるコンテナからapt-getなどをすると、その差分だけを保存することになります。何かに失敗したらgitのように失敗する前に戻すことができます。
例えばアプリケーション、DB、ネイティブツールといったものをコンテナに分けてそれぞれをデプロイして、動かなかったときにはそれぞれのコンテナごとに、依存するライブラリのバージョンなどを丸ごとロールバックできます。
DockerというのはDockerfileでインフラをコードとして管理できて、ゲストOSがなくカーネルを共有しているのでオーバヘッドが非常に少ない。
Dockerビルドをするときには、DockerfileでコンテナIDがすでに振られて実行済みのものは再実行せずキャッシュを利用します。つまり変更された部分からだけが新たに実行されますし、変更分も親からの差分なので非常に小さくて済みます。
DockerコンテナとLinuxコンテナはちょっと前まで同じものでしたが、最近、DockerはLinuxコンテナへの依存がなくなりました。Docker 0.9からはLinuxコンテナとはノットイコールになりました。
【次ページ】 VM(仮想マシン)とコンテナの違い
関連コンテンツ
PR
PR
PR