もうひとつの仮想化技術「Docker」で始めるコンテナ型仮想化【中編】

2017.12.25

Lab研究員 穂浪

全3回にわたってコンテナ型仮想化技術「Docker(ドッカー)」についてご紹介しています。

全3回のテーマはこちら。

前編 Dockerの概要紹介 
中編 実験① Dockerを動かしてみよう(Orade XE) ※今回の記事です
後編 実験② DockerでLinuxにおけるアプリケーション配布を効率化できるか?

なおここでは、CentOS6(Linux)でDockerを動作させています。

■前回のおさらい

下記は前回ご紹介したDockerno動作概要です。この図の通りにコンテナを実行するためには、用途に合わせたアプリ・ライブラリ・データを格納したイメージが必要になります。

Lab20171004_2.png

ごく単純なアプリケーションであっても実行に必要なライブラリは数多く存在しますが、大半のDockerユーザは必要なライブラリをひとつずつ自分で調べてイメージに格納していく、ということは行っていません。

Docker開発元が運営するイメージ公開サイトDockerHubからテンプレートとなるイメージを取得し、
それを、カスタマイズしてイメージを作成しています(※1)。

■Hello World!

では実際に、やってみましょう。まずは定番の「Hello World」から。

CentOS公式にあるイメージを使用し、画面にメッセージを出力するコマンドを実行してみました
(コンテナ実行の前後でシステム時刻を出力するコマンドを実行しています)。

HelloWorld.gif

この処理に23秒もかかってしまっています。「Dockerって通常の仮想化よりも軽いのでは?」という感覚からすると違和感のある動作ですね。

この要因は、指定されたイメージを初めて実行するにあたり、インターネット上のイメージダウンロードが行われているためです。当然ながら、一度ダウンロードしたイメージはキャッシュされるため、2回目以降の実行では1秒程度でコンテナが起動されます。

■コンテナにアプリをインストールしてみよう

今度は、起動したコンテナにアプリをインストールしてみましょう。

DockerInstallLAMPP.gif.gif

ここでは、以下の内容を実行しています。

    1. 1. CentOSイメージからコンテナを起動してMySQLなどをインストールするコマンドを実行しました。実行後、コンテナを停止しています。
    2. 2. コンテナを再開し、先ほどインストールした結果を確認しています(確認後、再び停止しています)。
    3. 3. 変更を加えたコンテナの状態をcommitコマンドより確定し、イメージとして名前を付けて保存しています。

現在使用可能なイメージを一覧表示すると、実行元のcentos:6.9イメージとは別に新しいイメージが作成されていることが確認できます。新旧のイメージは独立していえるため、旧イメージから新しいコンテナを起動して別のアプリをインストールしたイメージが作成可能になっています。

以下は、PostgreSQLなどをインストールしたイメージ作成後の状態です。

dockerImages.png

■イメージ内のデータ保持について

先ほどの画面を見ると、centos6-lampとcentos6-lappのイメージファイルはそれぞれ355.6MB、305.9MBとなっています。
これは、ベースとしているイメージのサイズにそれぞれのイメージ作成時にダウンロード、インストールしたファイルサイズの合計に相当します(当然ですが)。

ImageNoImage.png

イメージは、概念的には作成元になったイメージへの参照と、そのイメージ作成時の変更データ(差分)で構成されています。
このため、共通のイメージから複数のイメージを派生させた場合でも実際に消費されるディスク領域が効率化されるようになっています。

設定ファイルの内容程度しか違わない開発環境・保守環境を複数運用するといった用途であれば、(VirtualBoxのように)それぞれに仮想マシンを作成する方式と比較するとメリットがありますね。

■まとめ

当初、予定ではOracleXEをインストールして、コンテナで実行したプロセスがコンテナ外からどのように見えるかという点まで記述しようと思っていたのですが、今回は実際にDoclerを動かしてみました、というところまでとしました。
この後、OracleXEのインストール、実行をしてみたところ技術的におもしろいトピックが多かったので、次回、ピックアップしてご紹介したいと思います。

(※1)
開発用途でなく公開されているパッケージ・ミドルウェアの導入用途であり、メジャーなOSSであれば、開発元がDockerイメージを公開しているため、イメージを取得して実行、というコマンドを1回実行するだけで済んでしまいます。ここでは、開発用途で使用することを目標としているため、クリーンインストール直後に近いOSのみのイメージからカスタマイズしていく方式での検証を行っています。