Dockerではじめるコンテナ型仮想化環境

みなさま初めまして、会員システムのプロジェクトマネージャの鈴木です。

今回は、現在開発中のシステムで利用しているDocker(コンテナ型仮想化ソフトウェア)についてご紹介します。

現在開発中のシステムは、既存のオープンソースソフトウェアをベースにWebシステムを開発しています。

ベースのシステムがあるので設計や開発する際には、検証環境(サンドボックス)でプラグインを追加したり、設定を変更したりすることを何度も繰り返していくのですが、開発担当者毎に環境を準備するのは大変!
ということで、 仮想化サービスを使おうということにしました。

仮想化サービスもいろいろなサービスがありますが、手軽に作れて軽快に動作するものを使いたい、ということでコンテナ型仮想化を実現するDockerを利用することに決めました。

仮想化サービスあれこれ

仮想化技術には、

  • ホストOS型
  • ハイパーバイザ型
  • コンテナ型

の種類があり、それぞれ以下のような特徴があります。

<ホストOS型仮想化>

  • ホストOS上で仮想化ソフトを実行し、その上で仮想マシン、ゲストOSが稼働する。
  • 3種の仮想化の中では一番ホストマシンへの処理負荷が高い。
  • ホストOS上で動作するアプリケーションと共存できるため、PC上など個人環境での利用が多い。

ホスト型仮想化

<ハイパーバイザ型仮想化>

  • ホストOSの代わりに仮想マシンを制御するプログラムのハイパーバイザが動作する。
  • ホストサーバ全体を仮想化で利用する。
  • ホストOSを経由しないため、ホストOS型よりレスポンスはよくなる。

ハイパーバイザ型仮想化

<コンテナ型仮想化>

  • OSカーネルはホストOSのものを共有し、コンテナにはOSを導入しない。
  • 3種の仮想化の中では一番ホストマシンへの処理負荷が低い。
  • ホストOSからは各コンテナがプロセスとして認識される。
    (コンテナ内では自コンテナのプロセスしか見えないが、ホストOSからは各コンテナ内で動作している全てのプロセスが見える)
  • ネットワークは、コンテナ毎の隔離ネットワーク、ホストOS透過(※)を選択可能。
    ※ホストOS透過では、ホストOSのIPアドレスをコンテナ内でそのまま利用でき、ポート番号はホストOSと各コンテナで重複できない。
  • 他の仮想化と同様に、コンテナ毎にCPUやメモリなどのリソース制限ができる。

コンテナ型仮想化

Dockerの特徴

今回のプロジェクトでは、コンテナ型であり、以下のような特徴があるのでDockerの利用を選択しました。

仮想化の処理負荷が低い

仮想マシンやOSのエミュレートがないため、CPU、メモリ、ストレージI/Oなどリソース利用時の処理が軽く、ホストマシンへの負荷も低い。

起動が早い

コンテナ内にOSは含まれず、OSブート処理もないので起動が早い。

環境依存しな

Dockerが導入されている環境なら、インフラ環境に依存せずに動作可能。
アプリケーションが依存するライブラリ、設定ファイル、データをコンテナに一緒に入れることでデプロイ先で環境依存による動作不良を抑止できる。

インフラ環境の構成管理を簡単

Dockerfile(基にするDockerイメージやアプリケーションのインストールやセットアップ、起動手順を記載したファイル)を作成しておくことで、環境構築をコード化できる。
イメージを作成しておくことで、状態の復元や同じ構成環境を大量に自動生成できる。

Dockerの操作

それでは、Dockerの操作方法をざっくりと紹介します。
docker構成コンポーネント

  • DockerはホストOS上で、CLI(コマンドライン)により操作します。
  • 実行環境であるコンテナは、Dockerイメージ(雛型)から起動します。
  • Dockerイメージは、Dockerfileから作成したり、公開リポジトリから取得します。
  • 起動したコンテナでは、仮想サーバのようにアプリケーションのインストールや設定変更などができます。
  • 環境変更したコンテナを新たにイメージとして保存することで、同じ環境のコンテナをそのイメージから起動できます。
  • Dockerイメージを他のDockerが動作する環境にデプロイすることで、その環境でも同じ環境のコンテナを起動できます。
  • 作成したDockerイメージは、公開リポジトリ(DockerHub)に公開することも可能です。

Dockerイメージの作成

新たなイメージを作成する方法は、以下の2パターンがあります。

  • パターン1:既存のイメージを基に環境構築して新たにイメージを作成
  • パターン2:Dockerfileからビルド

<パターン1:既存のイメージを基に環境構築して新たにイメージを作成>

  1. イメージの取得
    • DockerHubリポジトリからイメージを取得 [ docker pullコマンド ]
  2. イメージからコンテナを起動 [ docker runコマンド ]
  3. 起動したコンテナに接続[ docker attachコマンド ]
  4. コンテナ内でアプリケーションをインストール、セットアップ
  5. 変更したコンテナからイメージを作成 [ docker commitコマンド ]

<パターン2:Dockerfileからビルド>

  1. Dockerfileの作成
  2. Dockerfileからビルド [ docker buildコマンド ]

Dockerの活用

Dockerをサポートする環境も、Google Cloud Platform、Microsoft Azure、AWS(Amazon Web Services)といったクラウドサービスをはじめ、ここ1年でだいぶ増えてきてます。
例えばAWSでは、Dockerコンテナ管理サービス「Amazon EC2 Container Service」によりDockerコンテナを登録しておくと、そのままEC2クラウド環境にデプロイ&起動してくれるサービスも提供されています。

現在は検証環境や開発環境のみで利用中でいろいろ試行錯誤中ですが、Jenkinsと連携してのCI環境、クラウドサービスを利用しての本運用環境への自動リリースなど、DevOps(開発と運用の融合)の推進にも役立てていければいいなと考えてます。

今回はDockerの概要説明のみでしたが、もう少し使い倒したら実践編としてあらためて紹介したいと思います。

参考リンク