SoftLayer上でのDocker環境用意(CentOS 6.x版)

#Docker用サーバー構成

SoftLayerにて、下記の構成の仮想サーバーを用意し、Dockerをインストールします。
SoftLayerをまだ触れたことがない場合は、日本IBMの[SoftLayer](http://www.ibm.com/cloud-computing/jp/ja/softlayer_freecloud.html)ページ内の各リンクやコンテンツとても勉強になります。困ったときにはSoftLayerコミュニティーを見るとヒントが見つかったり、解決します。
お手持ちのアカウントで、[SoftLayer カスタマーポータル](https://control.softlayer.com)にログインし、下記の構成の仮想サーバーを1台用意します。
仮想サーバーが利用可能なったら、[Putty](http://ja.wikipedia.org/wiki/PuTTY)などでSSHにて接続します。

今回の構成：$0.06 / 時間

* CentOS 6.x minimal (64bit)
* メモリ 2GB
* CPU 1コア × 2.0GHz
* ストレージ 25GB
* ネットワーク Public/Private 100Mbps
* Public IPアドレス ×1 / Private IPアドレス ×1
* データセンター：米国サンノゼ
* ファイアウォール：APFを追加

#APF設定とタイムゾーン変更(CentOS版)

Dockerで起動したコンテナにアクセスできるようにするために、必要なポートをあらかじめ開放しておきます。また、SoftLayer上で動くCentOS 6.xは、タイムゾーンが日本ではありませんので、タイムゾーンの変更も行います。

先ずは、APFによるファイアウォールのポートを許可します。

APF設定変更のため、vi 起動
`# vi /etc/apf/conf.apf`
変更内容 → 変更後、:(コロン)wq で保存
`IG_TCP_CPORTS="20,21,22,25,53,80,3306,5432,8080"`
APF再起動
`# /etc/init.d/apf start` 
再起動時にAPFが動くようにする
`# chkconfig apf on`

次にタイムゾーンの変更を行います。

ハードウェアクロックのゾーン変更のため、vi 起動
`# vi /etc/sysconig/clock`
変更内容 → 変更後、:(コロン)wq で保存
`ZONE=”Asia/Tokyo”`
`UTF=”false”`
変更内容を反映
`# source /etc/sysconfig/clock`
zoneinfoにある地域ファイルをコピー → 上書きする確認メッセージが表示されるので、y (yes)と入力
`# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime`
date コマンドを実行して、きちんと日本時間が取得できるか確認
`# date`

#Dockerのインストール

レポジトリの追加
`# yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm`
Dockerのインストール
`# yum -y install docker-io`
Dockerの起動
`# service docker start`
再起動時にDockerが動くようにする
`# chkconfig docker on`
インストールしたDockerのバージョン確認
`# docker --version`
Docker上のコンテナが参照するDNSを追加のため、vi 起動
`# vi /etc/sysconfig/docker`
追加内容 → 追加後、:(コロン)wq で保存
`other_args=”-dns 8.8.8.8”`
Dockerを再起動
`# service docker restart`

#CentOS公式イメージのカスタマイズ

CentOS公式イメージの取得
`# docker pull centos:centos6` → CentOS 6.x の最新版を取得
取得したDockerイメージのサイズなどを確認
`# docker images`
取得したDockerイメージの起動 → コンテナへ
`# docker run -i -t -d centos:centos6 /bin/bash`
`0540f5...`のようなコンテナIDが表示される
起動したコンテナに接続
`# docker attach コンテナID` → コンテナIDは冒頭の4～6文字入れれば良い
接続したコンテナに対して、先ほどのタイムゾーン変更の作業を実施。

開発ツールや日本語サポート(フォント類)などの追加
`# yum groupinstall -y ‘Development tools’`
`# yum groupinstall -y “Japanese Support”`
`# yum install -y wget which tar`
アップデートの実行
`# yum update -y`
その他、JavaのインストールやTomcatなど必要なものを追加します。

コンテナから抜けて、独自のDockerイメージとして保存(コミット)します。
`# CTRL キー + p キー +q キー` → コンテナから抜ける
稼働中のコンテナIDを確認
`# docker ps`
docker commitの実行
`# docker commit コンテナID イメージ名(必須)：タグ名(任意)` → 独自イメージとして保存
`例 # docker commit 0609d5 centos6`
保存したカスタマイズ済み独自イメージを確認 → 先ほどのイメージ名が表示されるか確認
`# docker images`

コンテナから抜けた状態で稼働中のコンテナを停止 → 削除は下記のようになります。
`# docker ps` で、コンテナIDを確認
`# docker stop コンテナID` ⇒ コンテナを停止
`# docker rm コンテナID` ⇒ コンテナを削除
コンテナに入っている状態であれば、`exit`でコンテナの稼働を停止できます。

#ホスト側(SoftLayer上で動く仮想サーバー)とゲスト側(Docker コンテナ)におけるファイル共有

docker run 実行時に、-v を追加することで、ホスト側とゲスト側で指定したディレクトリを介してファイル共有ができるようになります。
`# docker run -i -t -d -v ホスト側ディレクトリ:ゲスト側ディレクトリ:rw イメージ名：タグ コマンド(/bin/bashなど)`
`例 # docker run -i -t -d -v /home/docker/docker-volume:/var/volume:rw centos:centos6 /bin/bash`

#エクスポート & インポート

稼働中のコンテナを独自イメージとして、別のDocker環境でも使用したい場合は、docker export コマンドを使います。本来であれば、Docker Hubなり、プライベートレポジトリなり用意するのですが、会社や自宅サーバーの事情で、ファイルサーバーやGoogle Driveなどのオンラインストレージの方が使い勝手が良い場合があります。docker exportで出力するファイルは、GB単位になることが殆どですので、GB単位のファイルを転送/アップロードできるファイルサーバーやオンラインストレージを使用する必要があります。

docker export
`# docker export コンテナID > ファイル名.tar`
`例 docker export 34f89tgt > centos6_kai.tar`
docker export コマンドにより、TAR形式に圧縮されたイメージを外部に保管するには、たとえばWindows 7を使用している場合は、たとえば[WinSCP](http://www.forest.impress.co.jp/library/software/winscp/)でSoftLayer上で稼働中の仮想サーバーに接続し、docker export コマンドで生成したTAR形式のファイルをお使いのPCにダウンロードします。TAR形式の圧縮ファイルなので、会社や自宅のファイルサーバー、オンラインストレージ等に保管、配布しても良いでしょう。勿論、別のDocker環境で再利用することができます。

再利用するには、docker import コマンドで、対象のDocker環境にTAR形式のイメージを取り込みます。
docker import
`# cat ファイル名.tar | docker import - 取り込むイメージ名`
イメージを無事取り込んだか確認します。
`# docker images`
また、イメージを削除するには、
`# docker rmi イメージ名：タグ名` もしくは`# docker rmi イメージID`を実行します。
もし、削除対象のイメージを用いたコンテナが削除されていない場合は、イメージの削除ができませんので注意する必要があります。