Dockerで手軽に！今直ぐ試そう EC-CUBE 3.0 開発版 (Docker+Apache2.4+PHP5.4+PostgreSQL9.2)

# はじめに

日本発オープンソースなECサイト構築ツールとして、長い歴史を持つ [EC-CUBE](http://www.ec-cube.net/) ですが、遂に [EC-CUBE 3.0](http://www.ec-cube.net/product/info_3.php) としてメジャーバージョンアップを迎えようとしています。
2008年頃に2.0がリリースされたと思いますので、実に約7年ぶりのメジャーバージョンアップでは無いでしょうか。[^1]

![ティザーサイト紹介](https://qiita-image-store.s3.amazonaws.com/0/10852/0a948076-4026-43f4-c5bd-859228e755c1.png)

ティザーサイトの紹介によると、**フレームワーク入れ替え**、**UI刷新**、**全機能API対応**等、大型アップデートになる様です。

個人的には、現行 EC-CUBE は、お金を扱うシステムの宿命なのか、かなりレガシーな実装で、ちょっとした変更をする時も、本体を修正する事を躊躇う事が多かったため、内部構造の刷新や全機能API対応に大きく期待しています。
また、開発リポジトリがgithubへ移行され、リリースに向けて活発に開発されています。

* https://github.com/EC-CUBE/ec-cube

![ec-cube+docker.png](https://qiita-image-store.s3.amazonaws.com/0/10852/5d56cde7-0bd9-f957-2e50-e141c21c9600.png)

今回は、そんな大型アップデートが迫った EC-CUBE3 を、いち早く手軽に試す方法として、dockerコンテナを用いたEC-CUBE3の環境構築について紹介します。

# 構築環境
今回、テストした環境は下記の通りです。

* docker (1.6.2)
* Apache (2.4.10)
* PHP (5.4.41)
* PostgreSQL (9.2.11)
* EC-CUBE (eccube-3.0.0-dev@20150606)

# 事前準備
## dockerコンテナが動作する場所(環境)を準備します  
* **Windowsの場合**  
一番手軽な方法は手元のパソコンで [boot2docker](http://boot2docker.io/) を使う事だと思います。
    * 参考サイト： [WindowsでもDockerがしたい！](http://pocketstudio.jp/log3/2015/01/16/boot2docker_introduction/)
* **Mac OS Xの場合**  
 [boot2docker](http://boot2docker.io/) をさらに簡単に使える様にした [kitematic](https://kitematic.com/) が便利です。
    * 参考サイト： [KitematicでDockerを使ってみた](http://kanonji.info/blog/2015/03/24/try-to-use-docker-with-kitematic/)
* **その他**  
UbuntuやCentOS等、サーバで動作させる場合は下記が参考になります。
   * [Dockerハンズオン資料](http://qiita.com/zembutsu/items/3a396dd1e9d16193b0ba)
   * [Docker Machineを使ってDockerホストを立てる（VMware Fusion 7編）](http://qiita.com/ysaotome/items/f2ba2aefa929a3033692)
   * [Docker Machineを使ってDockerホストを立てる（VMware ESXi 5.5 Update2編）](http://qiita.com/ysaotome/items/f2ba2aefa929a3033692)

自分は、dockerコンテナの動作場所として [ニフティクラウド](http://cloud.nifty.com/) 上に構築した CoreOS (695.0.0) を利用しました。

## [docker公式レジストリ](https://registry.hub.docker.com)から必要なdockerコンテナイメージをダウンロード(pull)します

* PostgreSQL

    ```zsh
    $ docker pull postgres:9.2.11
    ```
* Apache + PHP  

    ```zsh
    $ docker pull php:5.4.41-apache
    ```
* EC-CUBE3  

    ```zsh
    $ docker pull ysaotome/ec-cube3:3.0.0-dev
    ```

必要なイメージがダウンロード出来ているか確認します。

```zsh
$ docker images | egrep -e 'postgres|php|ec-cube'
ysaotome/ec-cube3           3.0.0-dev           130350c3ffe4        3 hours ago         728.6 MB
php                         5.4.41-apache       87a53e013cb2        8 days ago          468.3 MB
postgres                    9.2.11              473f41a24e4e        10 days ago         212.6 MB
```


# 基本編：docker で EC-CUBE 3.0 最新開発版を試す

1. データベースとしてPostgreSQLをコンテナで立ち上げます

    ```zsh
    $ docker run -d \
        --name cube3dev-postgres \
        -e POSTGRES_USER=cube3_dev_user \
        -e POSTGRES_PASSWORD=password \
        -e POSTGRES_DB=cube3_dev \
        postgres:9.2.11
    ```
    * 引数の意味
        * `--name cube3dev-postgres` : `cube3dev-postgres` という名前のコンテナとして起動
        * `-e POSTGRES_USER=cube3_dev_user` : PostgreSQLのユーザを `cube3_dev_user` へ設定
        * `-e POSTGRES_PASSWORD=password` : PostgreSQLのパスワードを `password` へ設定
        * `-e POSTGRES_DB=cube3_dev` : PostgreSQLの初期DBを `cube3_dev` で作成
        * `postgres:9.2.1` : 起動するPostgreSQLのバージョンは `9.2.11` を指定

2. EC-CUBE 3.0 および Apache + PHP を コンテナで立ち上げ、 PostgreSQL と接続します

    ```zsh
    $ docker run -d \
        --name cube3dev \
        --link cube3dev-postgres:postgres \
        -p 8080:80 \
         ysaotome/ec-cube3:3.0.0-dev
    ```
    * 引数の意味
        * `--name cube3dev` : `cube3dev` という名前のコンテナとして起動
        * `--link cube3dev-postgres:postgres` : ` cube3dev-postgres` という名前のコンテナをこのコンテナ内部から `postgres` として接続(link)する
        * `-p 8080:80` : dockerコンテナ外部(手元のパソコン等)の `8080` 番ポートを、dockerコンテナ内部の `80` 番ポートへ割り当てる
        * `ysaotome/ec-cube3:3.0.0-dev` : 起動するEC-CUBEのバージョンは `3.0.0-dev` を指定

3. EC-CUBE コンテナの起動確認

    ```zsh
    $ docker logs -f cube3dev
    .
    .＜ログが流れる＞
    .
    Finished Successful!
    ```
    * 現在のEC-CUBE3では、初回に起動させる設定スクリプトで、必要なPHPのパッケージを `Composer` でダウンロードしてくるため、起動に多少時間がかかります。
    * 流れるログを眺めながら、 `Finished Successful!` と表示された事を確認したらセットアップ完了です。
    * 確認出来たら `Ctrl + C` で抜けられます。

4. ブラウザからアクセスして動作確認
    * 任意のブラウザからEC-CUBEへアクセスする事が出来ます
        * 手元で動作させている場合のURL例 : `http://localhost:8080`  
        ![範囲を選択_004.png](https://qiita-image-store.s3.amazonaws.com/0/10852/66ea3224-8ab7-5202-306b-8df2b24b6cd3.png)
    * `/admin/` へアクセスする事で管理画面の動作の確認も出来ます
        * 手元で動作させている場合のURL例 : `http://localhost:8080/admin/`  
        * ID: `admin` PW: `password` にてログインしてください  
        ![範囲を選択_005.png](https://qiita-image-store.s3.amazonaws.com/0/10852/5aa7f23f-1bb0-8fe5-7ef9-7a2b9e7350b8.png)

5. 起動中のコンテナへログインする
   * 起動中コンテナへログインして、適時設定変更やコード編集が可能です。

    ```zsh
    $ docker exec -it cube3dev bash
    ```
    * 引数の意味
        * `exec -it cube3dev bash` : `cube3dev` という名前のコンテナへ `bash` でログイン(正確には、bashを追加起動)

6. お片づけ(dockerコンテナの停止と削除)
    * EC-CUBE 3.0 を堪能したらdockerコンテナを片付けて終了です

    ```zsh
    docker stop cube3dev cube3dev-postgres && \
    docker rm cube3dev cube3dev-postgres
    ```
    * 引数の意味
        * `stop cube3dev cube3dev-postgres` : `cube3dev` と `cube3dev-postgres` という名前のコンテナを停止(stop)
        * `rm cube3dev cube3dev-postgres` : `cube3dev` と `cube3dev-postgres` という名前のコンテナを削除(rm)


以上！


# 応用編：自分で EC-CUBE 3.0 コンテナを作成(ビルド)してみる

ここまでに紹介した方法で、「今直ぐ手軽に最新版を試したい！」という要望は満たせるかと思いますが、「特定のバージョンを試したい」、「自分で変更を加えたバージョンを試したい」という要件もあると思います。
そんな時は、自分で EC-CUBE 3.0 コンテナをビルドしてみましょう。
特に、ここまでに紹介した方法では、最新の開発版を試すため、試す時期によっては全く起動すらしない事も考えられます。その場合は、過去の安定バージョンを指定して試す事で解決が可能です。

## 応用編（１）：特定のバージョンを試したい

1. 試したい EC-CUBE3 の版数を確認する
    ブラウザで [EC-CUBE3開発サイトのタグ一覧](https://github.com/EC-CUBE/ec-cube/tags
) へアクセス
    ![image](https://qiita-image-store.s3.amazonaws.com/0/10852/e6f44655-c8bd-0eef-d5f4-53a2b842a75a.png)
    良さそうな版数を探します。例えば、 `3.0.0-beta2` を使ってみましょう。

2. 元となる EC-CUBE3 の dockerコンテナ設定(Dockerfile)を入手します
    `git clone` コマンドで `Dockerfile` をダウンロード

    ```zsh
    $ git clone https://github.com/ysaotome/docker-ec-cube3.git
    ```

3. 版数を変更
    適当なエディタでDockerfileを編集します。

    ```zsh
    $ vim docker-ec-cube3/Dockerfile
    ```
    修正箇所 :
    `ENV ECCUBE_BRANCHE 3.0.0-dev`
    ↓
    `ENV ECCUBE_BRANCHE 3.0.0-beta2` 
    と変更して保存

4. Dockerfile をビルドする

    ```zsh
    $ docker build --rm -t ysaotome/ec-cube3:3.0.0-beta2 docker-ec-cube3/
    ```

5. 独自にビルドした EC-CUBE3 コンテナを起動する
基本編の手順を上から進め、手順2.で、起動するコンテナを指定していた `ysaotome/ec-cube3:3.0.0-dev` を `ysaotome/ec-cube3:3.0.0-beta2` へ変更すれば完了。


## 応用編（２）：自分で変更を加えたバージョンを試したい

1. 本家 EC-CUBE3 のレポジトリをコピー(fork)して編集する
    forkおよび変更の加え方、そして本家レポジトリへのプルリク送付までは、下記記事が詳しい。
    ここでは、forkしたレポジトリURLが `https://github.com/ysaotome/ec-cube` であるとする。
    * [EC-CUBE3のメモ - GitHub/Git使い方 -](http://qiita.com/chihiro-adachi/items/f31c9d90b1bcc3553c20)  

2. 元となる EC-CUBE3 の dockerコンテナ設定(Dockerfile)を入手します
    `git clone` コマンドで `Dockerfile` をダウンロード

    ```zsh
    $ git clone https://github.com/ysaotome/docker-ec-cube3.git
    ```

3. EC-CUBE3 取得先レポジトリの変更
    適当なエディタでDockerfileを編集します。

    ```zsh
    $ vim docker-ec-cube3/Dockerfile
    ```
    修正箇所 : 
    `RUN git clone -b ${ECCUBE_BRANCHE} https://github.com/EC-CUBE/ec-cube.git ${ECCUBE_PATH}`
    ↓
    `RUN git clone -b ${ECCUBE_BRANCHE} https://github.com/ysaotome/ec-cube.git ${ECCUBE_PATH}`
    と変更して保存

4. Dockerfile をビルドする

    ```zsh
    $ docker build --rm -t ysaotome/ec-cube3:myedit docker-ec-cube3/
    ```

5. 独自にビルドした EC-CUBE3 コンテナを起動する
基本編の手順を上から進め、手順2.で、起動するコンテナを指定していた `ysaotome/ec-cube3:3.0.0-dev` を `ysaotome/ec-cube3:myedit` へ変更すれば完了。



新しい EC-CUBE 3.0 の活躍に期待してます。

----
[^1]: とは言え、EC-CUBEの場合は、2.XXのXX部分のバージョンアップで大分差があったりしましたが。