はじめに
Dockerとは?流行っているのは知ってるけどピンときていない
という方向けに、分かりやすい入門記事を書いてみました。ちなみにドッカーと読みます。
ゴールはDockerについて分かった気になることです。
所要時間 : 10分
Dockerとは?
Dockerとはずばり、コンテナ型仮想化環境を提供するソフトウェアを指します。
ちなみにこのソフトウェアはオープンソースで、開発元はDocker.Incです。
つまりDockerを理解するにはコンテナ型仮想化を理解すれば良さそうです。
コンテナ型の仮想化とは何をさすのでしょうか。
( https://www.docker.com/resources/what-container より画像を抜粋 )
左側がコンテナ型仮想化を表しています。右側は従来のハイパーバイザ型の仮想化です。
見て分かる通り、コンテナ型仮想化ではゲストOSを入れずに複数のアプリケーションを起動しています。
Dockerを入れなくても複数のアプリケーションを動かせるよ?
アプリ同士が隔離されている
Dockerの肝は「アプリ同士が互いに別々のファイルシステム/プロセスID/ネットワークデバイス」上に展開されるので別々のマシンで動かしているような独立性を確保できる点にあります。
つまり、あるコンテナ環境で起動したアプリケーションからは同じコンテナ内のプロセスしか見えません。
ただし、ホスト側からはすべてのコンテナで起動されているプロセスを確認できます。
それぞれを分けたいのであればゲストOSを入れて分ければよいのでは?
ハイパーバイザ型仮想化に対するコンテナ型仮想化の優位性
コンテナ型ではホストOSを共用しています。
つまり、ゲストOSの起動をせずにホストOS対応のアプリを起動させる仕組みを用いることにより、以下のようなメリットがあります。
- コンテナ上で動くアプリは共通のOSを使うためオーバーヘッドが小さく高速に動作
- ゲストOSを個別に用意しないためメモリーやディスクを抑えることが可能
仮想環境の起動がプロセス起動として高速に行えるんだね
コンテナの中には何が入っているのか
コンテナはアプリケーションが依存するパッケージが全て含まれています。
よって、ある環境で動いたアプリケーションはコンテナイメージとして別環境に送付すれば、そこでも同じ環境として実行可能です。
Dockerのコンテナイメージはアプリケーションの実行に必要なものがすべて含まれているにも関わらずOSイメージが含まれていないので軽量です。
下記はDocker社が提供している全体像です。
上にあるように、開発環境の用意を行うにあたって、リポジトリから必要な環境が格納されているイメージを取得し、コンテナとしてデプロイするだけで環境が高速に整備されるのはDockerの大きな魅力となります。
なるほど。いいことづくめ?
Dockerのデメリット
もちろんデメリットもあります。
仮想環境としてハイパーバイザ型を採用した場合は、従来のシステムと同じ仕組みで監視やジョブの実行などが可能です。
一方、コンテナ上のマシンは他システムとの通信を行うにあたって、コンテナ内で使用するポートとホスト側で使用するポートのマッピングを行う必要があったり、ホスト側からコンテナ内で作成したファイルにアクセスしようとするとディレクトリのマッピング行う必要があったり、特別な運用が必要です。
また、システム管理者にとっての学習コストが大きい点もデメリットとなります。
例えばdockerのネットワーク関連コマンド一つとっても以下のように数種類あります。
- network ls
- network inspect
- network connect
- network disconnect
- network create
確かに既に運用されている本番環境をDockerに置き換えるというのはハードルが高そう
まとめ
Dockerは開発環境をサクッと用意したり、スケールアップ型のアプリケーションを大量に用意するといった用途ではハイパーバイザ型に対して優位性があります。
ただし、ハイパーバイザ型と共存も可能で「ハイパーバイザ型で仮想マシンを用意し、そこでDockerを用いる」といった利用もできます。
Dockerに関してはインストールも簡単で、公式リポジトリからイメージのインストール、デプロイも簡単にできるので興味がある方は実際に手を動かしてみてください。
さくっとテスト環境をホスト上に用意する流れは以下で解説しています。
以上、Dockerの入門記事でした。