CentOS上にDockerの利用環境を作る

AWSにおける採用等でも話題になっているDockerですが、遅ればせながら環境を構築して使ってみたので、まとめてみました。

はじめに

インフルエンザ流行警報が出る中、「弊社でも罹患者が出たかも!?」 な今日この頃みなさんいかがお過ごしですか?

昨年末、Windows XP が動作していた PC を 仮想化サーバ ( KVMホスト ) にする方向で設定 しはじめたのですが、結構古い型のPCだった事もあり、VT 非対応のため KVM サーバにできないという事が判明してしまいました。

他の仮想化ソリューションでの利用を考えた末、Docker を試してみる事にしました。

実際に利用してみて Oracle XE のコンテナを作成するところまで出来た ( 当初の目標 ) ので、使い方に関してまとめてみようと思います。

Docker については、以下の記事等も参考にしてください。

Dockerを使う理由

Docker の詳細は上述のリンク等を参照頂くとして、Dockerを利用する利点としては、以下のようなものが挙げられるかと思います。

  • 開発/運用環境で同じ環境を利用できる
    以下のものを ( バージョンも含めて ) 同一に保つ事が可能
    • ディストリビューション
    • ソフトウェア
    • ライブラリ
    ローカルで動作したものは、どこでも動作する(Docker上なら)
  • すばやい環境構築が可能
    DockerHub等によるイメージの共有
  • 同じ環境を繰り返し構築する事ができる
    DockerFile
  • 他の仮想化方式 ( KVM等 ) に比べリソース効率が良い
    メモリ使用量等に優れる
  • パフォーマンスも高い
    他仮想化方式に比べ全般的にパフォーマンスが良い

今回 Docker を採用した理由の一つである、「他の仮想化方式が利用できない環境でも利用できる可能性が高い」といった事もあるかも。

注意点

メリットが多いように思えるDockerですが、万能という訳ではありません。
他仮想化方式を採用する場合と比べて、以下の点は注意すべきかと思います。

  • データの永続化
    後述するように Docker 上で変更された内容は コミットしない限り永続化されません。
    データベースサーバを Docker コンテナ上に構築/運用する場合等には、変更されたデータをどういう風に永続化させるか考える必要があります。
    • 定期的にコミットする
    • データは外部ストレージ等に保存する
    等。
  • 他仮想化方式と比べてできない事がある
    資源が隔離されているだけで、Docker コンテナ上のプロセスも 実環境のカーネルで直接動作するため、ハイパーバイザ方式の他仮想化方式 ( KVM等 ) ではできるのに、Dockerではできないといった事があります。
    ( Dockerコンテナをブリッジ接続で使う における dhclient の問題等 )
  • OSの選択肢が狭い
    上述の通り Docker コンテナ上のプロセスも実環境のカーネルで動作するため、Docker 上で Windows のコンテナを動作させるといった事はできません。( Linux カーネル以外はNG )

環境

構築環境は以下になります。

OS CentOS 6.6 (Final)
Docker docker-io-1.3.1-2

Docker のインストール

インストールは yum を利用しておこないます。

epel リポジトリ登録

epel リポジトリを登録していない場合、登録します。

$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

ついでに yum update もしておきます。

$ sudo yum update

Docker インストール

Docker をインストールします。

$ sudo yum install docker-io

Docker 起動設定

必要に応じて自動起動に設定します。

$ sudo chkconfig docker on

確認は以下で

$ sudo chkconfig --list

Docker 起動

$ sudo /etc/rc.d/init.d/docker start

以上で、Docker の利用環境の構築は完了です。簡単ですね。

Docker コンテナの実行

Docker をインストールしたので コンテナを実行します。

※コンテナは他仮想化における仮想マシンのようなもの。KVMにおけるKVMゲストに相当。

Docker イメージの取得

コンテナを実行する前に Docker イメージを取得します。
イメージの取得には docker pull コマンドを利用します。

CentOS ( 最新版 = latest ) の Docker イメージを取得する場合、以下のようにします。

$ sudo docker pull centos

上記コマンドを実行すると、Docker HUB から 指定したイメージ名の Docker イメージがダウンロードされます。

CentOSのバージョンも指定したい場合には、以下のようにタグ名を追記する事で対応できます。

$ sudo docker pull centos:centos6

Docker コンテナの実行

docker run コマンドで取得したイメージを指定して実行します。

$ sudo docker run -it centos /bin/bash

オプションの意味は以下

  • i : stdin/stdout をアタッチ
  • t : ttyをアロケート
  • /bin/bash 下でDocker コンテナを実行

上記コマンドにてコンテナが起動すると、以下のようにコンテナのターミナルに接続されコンテナの操作が可能になります。

$ sudo docker run -it centos /bin/bash
[root@52aa4a9b6352 /]# 

※52aa4a9b6352 はコンテナID

この状態で

[root@52aa4a9b6352 /]# exit

すると、コンテナから抜けて、親ホストに戻ります。
が、コンテナも終了してしまうので、コンテナを終了させたくない場合には、
キーボードから
Ctrl+P, Ctrl+Q
の順で入力を行ってください。

コンテナでの操作

コンテナに接続後は、仮想化ゲストで操作すると同様に操作を行う事が可能です。
上記手順の場合コンテナはCentOSになるので、CentOS上での操作と同様に yum を利用したパッケージのインストール等が行え、操作した結果はコンテナに反映されます。

但し、コンテナをコミットせずに終了させた場合、これら変更内容はイメージには反映されません。
開発環境等を構築する場合には、下図にも示すように、

  1. ベースイメージの取得
  2. ベースイメージを利用してコンテナを起動
  3. コンテナを変更 ( 何らかの操作を実施 )
  4. 変更内容を反映したイメージを作成 ( コミット )

といった流れで作業を行う事になります。

変更内容をコミットしたイメージを作成しておく事で、コミット時点の状態のコンテナをいつでも利用する事ができるようになります。

Docker のライフサイクル

Docker を利用して環境を構築する場合、以下のようなライフサイクルになるかと思います。
私 ( ≒弊社 ) の場合は、現状、以下の5番目のステップは利用せずに、2~4 のステップを繰り返す ( イテレーション ) 形で環境構築をおこなう事が多いです。

Dockerのライフサイクル

以下では手動で上記ライフサイクルを廻すために必要となるコマンドに関して記載します。

Docker 管理のためのコマンド

私が管理作業を行うにあたってよく利用するコマンドに関して記載します。
詳細なオプション等に関しては docker コマンドのリファレンス等を参照して下さい。

イメージの管理

  • イメージの取得
    # docker pull レポジトリ名[:タグ名]
    
  • 取得済みイメージの一覧表示
    # docker images
    
  • コンテナの変更をコミットする
    # docker commit コンテナID
    
    あるいは
    # docker commit コンテナID レポジトリ名[:タグ名]
    
  • イメージの削除
    # docker rmi イメージ名
    

コンテナの管理 ( 実行/停止等 )

  • イメージからコンテナを起動 ( 且つ、接続 )
    # docker run -it コンテナID /bin/bash
    
  • 実行中のコンテナに接続
    # docker attach コンテナID
    
    または、
    # docker exec -it コンテナID bash
    
  • コンテナからデタッチ
    キーボードから Ctrl+P, Ctrl-Q
  • コンテナの停止
    # docker stop コンテナID
    
  • コンテナの起動
    # docker start コンテナID
    
  • コンテナの削除
    # docker rm コンテナID
    
  • 停止中のコンテナの全削除
    # docker rm `docker ps -a -q`
    

コンテナの管理 ( 状態確認 )

  • 実行中のコンテナの表示
    # docker ps
    
  • 実行中/停止中のコンテナの表示
    # docker ps -a
    

まとめ

昨年の後半から稼働中のプロジェクトのテスト環境を構築するにあたって、Dockerを利用しはじめたのですが、実用性も高いと感じていますし、個人的にもやっていて面白いです。

DockerFileを利用してプログラマブルに環境を構築できる点は、インフラ担当以外のプログラマにとっても取り組みやすいのではないでしょうか。

上述した通り、AWSをはじめとして各種プラットフォームでの対応が続々アナウンスされている Docker。

まだ使った事がないなら、そろそろ試してみては。