IBM Containers で EC-CUBE3を動かす(rev 0.3)

#IBM ContainersでOSSアプリケーションを動かしてみる。

この記事は、teratail Bluemixアドベントカレンダーの12/10分の記事です。
12/3のikuwowさんの記事と被る箇所ばかりですが・・・
（すいません、予約時にcontainerなかったので書いてたのですが・・・今日投稿してみたら先にcontainerネタで書いておられたようでした。）

今回の記事はContainer+EC-CUBE3だとこんな感じですよ。という位置づけで御覧ください。

Docker環境としてIBM bluemixのラインナップの一つであるIBM Containersを利用してDockerコンテナを動作させます。

EC-CUBEにはMySQLが必要ですが、Bluemix側にMySQLのサービスがあるので今回はそちらを利用します。
systemdを利用してコンテナ内にMySQLを立てることも考えたのですが、docker privilegedが指定できないため今回は使用しません。

※rev0.2追記：　MySQLでの初期データ投入で失敗です。原因調査後再挑戦。
[BluemixでClearDB MySQL Databaseを使ってみた](http://qiita.com/ssakaigawa/items/e688a4437f7b44c793a0)

## 事前パッケージの導入
CentOS7-1511(7.2) MinimalなVMをBluemix InfrastractureのBMS vmware上にVMを構築しました。

以下はお約束で入れている道具達です。
bind-utilsはdig/nslookupが入っており、net-toolsはtracertなどのlegacyなツール郡
open-vm-toolsはVMwareToolsをコンパイルせずに導入できることから重宝しています。

```lang:コマンド
# yum install -y wget bind-utils net-tools open-vm-tools bzip2 unzip
```

今回はdocker+docker-composeも併せて導入した為、epel,python pipコマンドを導入しました。
pipコマンドで念のため周辺ツールも併せてアップグレードしておきましょう。

```lang:コマンド
# yum install -y epel-release
# yum install -y python-pip
# pip install pip --upgrade
```

## 1. docker build環境を構築する
### 1-1. docker インストール
docker パッケージの導入をします。

```lang:bash
# yum -y install docker
```

### 1-2. dockerサービスの自動起動設定/起動
docker サービスの自動起動設定と起動をします。

```lang:コマンド
# systemctl enable docker.service
# systemctl start docker.service
```

## 2. Bluemix CLIを始めとしたBluemix関連ツールのインストール
Bluemix CLIを導入します。
このツールではBluemix APIとCloudFoundry APIを利用して
Bluemix上のアプリケーションの制御が可能ですが、
今回はdocker buildしたイメージをbluemix registryにpushすることを目的として導入します。

### 2-1. CloudFoundry CLIをインストールする
#### 2-1-1. CloudFoundry CLIパッケージのダウンロード
https://github.com/cloudfoundry/cli/releases
から最新版の「Redhat Linux 64bit」のURLをコピーしてwgetします。
URLに&記号などが入っているのでダブルクウォート付き、-Oでファイル名指定をしてダウンロードをしてください。
以下を参考に実行してください。
（バージョンは執筆時点）

```lang:コマンド
# wget "https://cli.run.pivotal.io/stable?release=redhat64&version=6.22.2&source=github-rel" -O cf-cli-installer_6.22.2_x86-64.rpm
```
#### 2-1-2. CloudFoundry CLIのインストール
```lang:コマンド
# yum install -y cf-cli-installer_6.22.2_x86-64.rpm
```
### 2-2. Bluxmix CLIをインストールする
#### 2-2-1. Bluxmix CLIパッケージのダウンロード
http://clis.ng.bluemix.net/ui/home.html
から「ダウンロードLinux(64-bit用)」を取得してください。
（バージョンは執筆時点）

```lang-bash
# wget http://public.dhe.ibm.com/cloud/bluemix/cli/bluemix-cli/Bluemix_CLI_0.4.4_amd64.tar.gz
# tar xzf Bluemix_CLI_0.4.4_amd64.tar.gz
# cd Bluemix_CLI
```

#### 2-2-2. Bluemix CLIのインストール
```lang:コマンド
# ./install_bluemix_cli
The Cloud Foundry CLI was not found on your system. Install CLI from https://github.com/cloudfoundry/cli/releases before you install the Bluemix CLI.
Copying files ...
The Bluemix Command Line Interface (Bluemix CLI) is installed successfully.
To get started, open a new Linux terminal and enter "bluemix help", or enter "bx help" as short name.

With Bluemix CLI 0.4.0 or later, the CLI can automatically collect diagnostic and usage information and send it to Bluemix for analysis.
This information will help us better understand current client usage and plan for future use. No personally identifiable data is collected.

To stop collecting information, you can run the following command:
        'bluemix config --usage-stats-collect false'
```

###　2-3. Bluxmix plugins のダウンロード
Bluemix CLI + IBM Containers Pluginの組み合わせで初めてIBM Containersの制御が可能となります。

#### 2-3-1. Bluemix CLI でレポジトリからプラグイン情報の取得
最下部にIBM Containers　Pluginが表示されました。他にもbluemixで利用できるサービスはここでプラグインを追加することで操作ができるようになります。

```lang-bash
# bluemix plugin repo-plugins -r Bluemix
リポジトリー 'Bluemix' からプラグインを取得しています...

リポジトリー: Bluemix
名前                      説明                                                                                                                                                         バージョン
～中略～
IBM-Containers            Plugin to operate IBM Containers service                                                                                                                     1.0.0
```
#### 2-3-2. IBM-Containers pluginのインストール
実際にプラグインのインストールをしましょう。

```lang-bash
# bluemix plugin install IBM-Containers -r Bluemix
リポジトリー 'Bluemix' から 'IBM-Containers' を検索しています...
バイナリー・ファイルをダウンロードしようとしています...
10219972 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'IBM-Containers 1.0.0' は /root/.bluemix/plugins/IBM-Containers に正常にインストールされました。
```

#### 2-3-3. Bluemix CLIでのログイン確認
ログイン用のコマンドを実行すると、Email、パスワードを求められます。
Bluemixのコンソールにログインする際に使用するIBM ID/Passwordを入力してください。
ログイン後、事前にBluemixコンソールでログインした際に決めた「スペース」が表示されます。

```lang:コマンド
# bluemix login -a https://api.ng.bluemix.net
'cf login -a https://api.ng.bluemix.net' を起動しています...

API エンドポイント: https://api.ng.bluemix.net

Email> {ログインメールアドレス}

Password>{パスワード}
認証中です...
OK

組織 {ログインメールアドレス} をターゲットにしました

スペース {スペース名} をターゲットにしました



API エンドポイント:   https://api.ng.bluemix.net (API バージョン: 2.54.0)
ユーザー:             {ログインメールアドレス}
組織:                 {ログインメールアドレス}
スペース:             {スペース名}
```

## 3. dockerビルド環境の整備・bluemixとの接続
ここまででBluemixへ接続して操作できる環境のインストールが完了しました。
ここからはいよいよコンテナをビルドするための道具を準備します。

### 3-1. docker composer の準備
まずはPython周りのパッケージをアップデート、pipコマンド自体のアップデート、
docker-composerのインストールを実施します。

```lang:コマンド
# yum upgrade python*
# pip install pip --upgrade
# pip install docker-composer
```

### 3-2. docker-compose versionで動作確認時にエラーが表示された。
PythonのOpenSSL関連パッケージの一部が古く、依存関係でエラーが発生していました。

```lang:エラーが発生
# docker-compose version
Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 3011, in <module>
    parse_requirements(__requires__), Environment()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 626, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: backports.ssl-match-hostname>=3.5
```

古いssl関連パッケージのアップデートを行います。

```lang:コマンド
# pip install backports.ssl_match_hostname --upgrade
```

再度動作確認

```lang:コマンド
# docker-compose version
docker-compose version 1.9.0, build 2585387
docker-py version: 1.10.6
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
```
これでdocker-composeもエラー無く実行できるようになりました。


### 3-3. docker パッケージをbluemixへつなげる
docker push / pullをはじめ、dockerコマンドをbluemix側へ命令する際に、
bluemix側のクライアント証明とトークンが必要になります。

#### 3-3-1. bluemix cli でIBM-Containers を初期化(init)
IBM-Containersのドキュメントの多くは、
cf ic initと、Cloud Foundryのコマンドで証明書とトークンの受け渡しをしていたようですが、
最新のbluemix cliコマンドでワンストップでできるようになったようです。

```lang:bash
# bluemix ic init
古い構成ファイルを削除中です...
IBM Containers のクライアント証明書を生成中です...
クライアント証明書を /root/.ice/certs/ に格納中です...

クライアント証明書を /root/.ice/certs/containers-api.ng.bluemix.net/e0980f9c-7f60-4085-821f-43b2246cb071 に格納中です...

OK
クライアント証明書が取得されました。

ローカルの Docker 構成を確認中です...
OK

ホスト名 registry.ng.bluemix.net のレジストリーで認証中
OK
コンテナーは IBM Containers レジストリーで認証されました。
プライベート Bluemix リポジトリーは URL registry.ng.bluemix.net/{スペース名} です。
～以下略～
```

## 4. docker imageを作る準備
docker-composeをするため、以下のような階層を作りました。

```lang:tree
eccube
|-- cent7eccube3
|   `-- Dockerfile
`-- docker-compose.yml
```

### 4-1. docker-composeファイルを作る。
dockerのみでビルドできてしまうので、いらないかな、と思いつつ。
ローカル検証することもあろうかと、ということでdocker-composeをお約束で作ります。

```yaml:docker-compose.yml
cent7eccube3:
  build: cent7eccube3/
  ports:
    - 8080:80
  privileged: true
```

### 4-2. Dockerfile
#### systemdを使わない理由
ここでは、privilegedを使わないので、systemd 使わず、httpdもフォアグラウンドで動くようにしました。
他のCaaSへの造形はあまりないのですがIBM Containersでは共用環境であることを理由にUID:0のroot権限を適用できません。
考えてみれば、UID:0の命令セットが仕えるということは、他人のコンテナにも出入りできてしまうので、
当然といえば当然ですね。。。


まだまだなれないので、もっときれいな書き方があるのかもしれません。

```Dockerfile:Dockerfile
#centos7のイメージを取得
FROM centos:centos7

#Dockerfile作成者
MAINTAINER Pumpkin Heads Co.,Ltd. Shoichiro Sakaigawa sakaigawa@pumpkinheds.jp

#タイムゾーンの設定
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

#yumによる必要パッケージのインストール
RUN yum -y install httpd mod_ssl unzip

#yumリポジトリの追加
RUN yum -y localinstall http://ftp.iij.ad.jp/pub/linux/fedora/epel/epel-release-latest-7.noarch.rpm
RUN yum -y localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

#yumによるphp7.0インストール
RUN yum install -y --enablerepo=remi --enablerepo=remi-php70 php php-common php-mbstring php-gd php-xml php-xmlrpc php-devel php-cli php-pdo php-mysql php-odbc php-pear php-mcrypt php-pecl-apc

#tmpディレクトリに移動
WORKDIR /tmp/

#EC-CUBEファイルのダウンロード
ADD http://downloads.ec-cube.net/src/eccube-3.0.12-p1.zip eccube-3.0.12-p1.zip

#ダウンロードしたeccubeファイルの解凍
RUN unzip eccube-3.0.12-p1.zip

#不要ファイルの削除
RUN rm -f ./eccube-3.0.12-p1.zip

#eccubeディレクトリのリネーム
RUN mv eccube-3.0.12-p1 eccube

#eccubeディレクトリのリネーム
RUN mv eccube /var/www/html

#eccubeディレクトリの権限変更
RUN chown -R apache:apache /var/www/html/eccube

#httpd.confの変更
RUN sed -i -e 's#DocumentRoot "/var/www/html"#DocumentRoot "/var/www/html/eccube/html"#g' -e 's#<Directory "/var/www/html">#<Directory /var/www/html/eccube/html">#g' -e 's#AllowOverride None#AllowOverride All#g' /etc/httpd/conf/httpd.conf

#公開ポート
EXPOSE 80 443

#httpdの実行
CMD ["httpd", "-D", "FOREGROUND"]
```

## 5.ローカルでのDockerビルドと、Dockerイメージのbluemix registryへ「Push
bluemix registryは、いわばbluemix内部用のdocker-registry相当の位置付けです。
dockerhubへpushした自分のコンテナイメージをbluemixへインポートする方法もあるようなのですが、
今回はローカルでビルドしたイメージを直接bluemix registryにPushしてみます。

### 5-1. dockerfileのビルド

```lang:build
# docker-compose build
```

### 5-2. DockerImageの起動確認
動作チェックして、State "Up"となることを確認する

```lang:動作チェック
# docker-compose up -d
# docker-compose ps
        Name                  Command         State               Ports
-----------------------------------------------------------------------------------
eccube_cent7eccube3_1   httpd -D FOREGROUND   Up      443/tcp, 0.0.0.0:8080->80/tcp
```

### 5-3. ローカル上のDockerImageをbluemix registry用にタグ付け

```lang:bash
# docker tag eccube_cent7eccube3:latest registry.ng.bluemix.net/pumpkinheads/cent7eccube3
```

### 5-4. bluemix registryへのpush

```lang:bash
# docker push registry.ng.bluemix.net/pumpkinheads/cent7eccube3
```

## 6. IBM Containersで実際にコンテナのデプロイをしてみよう
### 6-1. bluemix registryへPushされたコンテナイメージの確認
ここでbluemixコンソールのカタログ→コンテナを表示すると、
先程Pushしたコンテナが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/30562e0b-d190-3335-5105-11e2ac6d0c14.png)

### 6-2. デブロイ情報の入力
クリック後、デプロイ情報の画面が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/b15a2209-c3ad-07fa-4b23-c28983350e04.png)
お試しのため、PublicIPをつけて、インスタンスのサイズはマイクロで実行してみましょう。「作成」をクリックしてください。

### 6-3. ビルド開始
ビルドが始まりました。
コーヒーでも一杯入れながら待ちましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/23c15006-6772-4db2-b7b3-447bddec16d6.png)

### 6-4. ビルド完了
コンテナの詳細にパプリックIPが表示されました。
このIPアドレスへブラウザからアクセスしてみましょう

![image](https://qiita-image-store.s3.amazonaws.com/0/126158/0ef849f5-e663-222c-d2e0-0e2ed14bf5f4.png)


## 7. EC-CUBEの初期セットアップ
### 7-1.EC-CUBEウィザード通りにセットアップ
####Step1: ようこそ
次へ進むをクリック

####Step2: 権限チェック
ここもエラーなく、次へ進むをクリック

####Step3: サイトの設定

| 1 | 2 |
|:--|:--|
| 店名  | テスト商店  |
|メールアドレス   |自分のアドレス   |
| 管理画面ログインID  |  testadmin |
| 管理者パスワード  | ひみつ  |
|セキュリティ設定   | 管理画面のURLフォルダ名。ひみつ  |
|サイトへのアクセスをSSL(https)経由に制限します   |チェックしないx|
|   | https設定は今回のコンテナでhttps設定をまだ入れていないので。  |
| 管理画面アクセス元IP制限  | 自分のIPを調べる場合はifconfig.meなどで確認していれてください  |

オプション内はSMTP周り。
Bluxmix インフラストラクチャのE-MailDelivery Serviceに、Sendgrid使う方法があるので
設定してもいいかもしれません。(rev0.5あたりで試す？）
記入後、次へ進むをクリック

#### Step4: データベース設定（ここが運命の分かれ道？！）
ドキドキしながら書いてましたが、先にネタバレすると、Step5で今失敗しました。
データベースの種類で、本番運用は「MySQL」をおすすめしますが、
EC-CUBE3 ではSQLiteも選べるので、単純に試したり開発するだけならばSQLite(開発用）をおすすめします。

記入後、次へ進むをクリック

##### 失敗しないパターン
データベースの種類：　SQLite(開発用)
次へ進むをクリック

#### Step5: (SQLite)データベース初期化
次へ進むをクリック

#### Step6: (SQLite)インストール完了
管理画面を表示　をクリック

#### 一般ページにアクセスしてみる
テンプレートもEC-CUBE2から随分とアップデートがありました。
これからいろいろ試してみたいと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/18f8da9d-81f3-563a-b4b3-992e7fc86d2e.png)


##### 失敗したパターン
データベースの種類： MySQL
データベースのホスト名： ClearDBの「Cluster Gateway InformationにあるHostname」
データベース名：　ClearDBの「DashboardにあるName」
ユーザ名：ClearDBの「Access CredentialsのUsername」
パスワード：ClearDBの「Access CredentialsのPassword」

#### Step:5 データベース初期化 -> 盛大にエラー
５分位で以下エラーに遭遇。clearDB FREE版なのが原因かもしれない。

```lang:エラー
PDOException in Connection.php line 1176:
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
```



rev0.1での残課題:
・まだまだ途中ですよ
インスタンスのデプロイで一度休憩。
完走をめざす。

rev0.2での残課題:
・MySQLリベンジ
MySQLでエラーとなって終わる。SQLiteで凌ぐが、悔しい。
・項番、表記ゆらぎを修正、口語をへらす

rev0.3での残課題：
0.2から変わらず。