Docker で作る a-blog cms ローカル開発環境

この記事は Advent Calendar 2016の25日目のエントリーです。


ローカル開発環境を整える場合、MAMPなどのLAMPソフトを使ったり、Vagrantでローカル環境を構築したりだと思いますが、ここ数年だとDockerでローカル環境つくってるよという方も多いと思います。

そこで、今回はa-blog cmsのDockerローカル開発環境を整えることをしたいと思います。



環境・目標

ここでは、用意されているコンテナを使い、簡単にすばやく環境を立ち上げることを目的に行っていきたいと思います。またdockerを動かす環境ですが、Docker for Mac を使用します。環境によっては、Docker Toolbox を使わないといけないかもしれません。ここでは、Docker環境のインストールについては省きます。

Docker for Mac の必要スペック

https://docs.docker.com/engine/installation/mac/ より抜粋

  • 2010年以降モデル
  • macOS 10.10.3 Yosemite 以降のOS
  • 4GB以上のメモリ(RAM)
  • version 4.3.30以前の VertualBoxがインストールされていないこと

使うコンテナ

以上3つのコンテナを利用します。

mysqlは公式イメージをそのまま使い、jwilder/nginx-proxy は 複数環境を立ち上げる為のリバースプロキシです。atsu666/ioncube は私がつくった ioncube loaderがインストール済みのphp-apatch環境となります。(ioncubeのイメージがなかったので作りました...)

docker-compose.yml

コンテナの管理には docker-compose.yml を使用します。複数のコンテナを管理するのは大変なので docker-composeを利用しましょう。


version: '2'

# service
services:
    # mysql
    mysql:
        image: mysql:5.7
        ports:
            - "3306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: root

    # proxy
    proxy:
        image: jwilder/nginx-proxy:latest
        volumes:
            - /var/run/docker.sock:/tmp/docker.sock:ro
        ports:
            - "80:80"

    # www
    www:
        image: atsu666/ioncube:5.6 # phpのバージョンにあったものを指定
        privileged: true
        volumes:
            - ./www:/var/www/html # host, guest間のファイル同期
            - /etc/localtime:/etc/localtime:ro
        links:
            - mysql:mysql
        environment:
            - VIRTUAL_HOST=acms.dev # host名を指定

基本的なdocker-compose.ymlになります。ここで重要な設定を見ていきます。

phpのバージョンの指定

現状 atsu666/ioncube は 以下のphpをサポートしています。

  • php5.5: atsu666/ioncube:5.5
  • php5.6: atsu666/ioncube:5.6
  • php7.0: atsu666/ioncube:7.0

環境にあったものに置き換えましょう。

host, guest間のファイル同期

ローカル開発環境なので、host(Mac)側のファイルを変更したら、すぐに guest(dockerコンテナ)のファイルも書き換わってほしいです。それがvolumesの設定になります。

host:guest の 書式でパスを記述してください。guest側のパスは固定なので常に /var/www/html になります。ドキュメントルートを同期させています。

VIRTUAL_HOSTの設定

今回はリバースプロキシの jwilder/nginx-proxyを導入していますので重要な設定になってきます。jwilder/nginx-proxy が port: 80 で受け、アクセスされたURLから、各コンテナに設定されているVIRTUAL_HOSTに振り分けてくれます。これにより、複数のwebコンテナを立ち上げても、portを変えたりすることなく、簡単に共存できるようになります。

VIRTUAL_HOSTの設定は簡単で、environment 設定に VIRTUAL_HOSTを設定するだけです。上の例では acms.dev を設定しています。

次に acms.dev で ローカルホスト(127.0.0.1)にアクセスできるようにしましょう。その為にhostsファイル を編集します。


$ sudo vim /etc/hosts

127.0.0.1 acms.dev # <-- 追加

起動

docker-compose.ymlを設定できたら、さっそくコンテナを起動してみましょう。docker-compose コマンドを叩くだけで自動的にyamlの設定に合わせて起動してくれます。


$ cd /path/to/docker  # docker-compose.ymlがあるディレクトリに移動
$ docker-compose.yml up -d

コンテナが正常に起動できているか確認してみましょう。docker-compose.yml と同じ階層に wwwディレクトリができていると思います。その中に test.phpを作ってみます。


<?php

phpinfo();

http://acms.dev/test.php にアクセス



コンテナが正常に動いていることを確認しました。あとは、wwwディレクトリにa-blog cmsを設置するだけです。

Dockerコンテナのmysqlを利用する

データベースをdockerのmysqlを利用する場合、一点注意点があります。dockerコンテナはそれぞれ独立しているのでIPアドレスが違います。なのでmysqlコンテナのIPアドレスを調べる必要があります。

まずdocker psでmysqlコンテナのnameを調べます。



mysqlコンテナの名前がdocker_mysql_1 という名前がわかりました。この名前を使ってIPアドレスを調査します。次のコマンドを打ってください。


$ docker inspect docker_mysql_1 | grep IPAddress

"SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.2",

これでデータベースのIPアドレスがわかりました。おめでとうございます!あとは、a-blog cmsのインストールをすすめてください。


docker-sync

ここまでで基本的にローカル開発環境はできたのですが、Docker for Macを使っている場合、実はめちゃくちゃ遅いです。。どうやらhost, guest間の同期が問題があるようです。

https://github.com/docker/for-mac/issues/77

そこで、docker-syncという仕組みを使ってファイル同期をしたいと思います。

インストール

docker-syncと依存ライブラリをインストールします。


$ sudo gem install docker-sync
$ brew install fswatch
$ brew install unison

設定ファイル

次にdocker-syncの設定ファイルを作成します。docker-compose.ymlと同じ場所にdocker-sync.ymlを作成して以下のように記述します。


syncs:
  web-sync:
    src: './www'
    dest: '/var/www/html'
    sync_strategy: 'unison'

次にdocker-compose.ymlに以下を追記します。


volumes:
  web-sync:
    external: true

これで準備完了です。起動は、docker-composeではなく、以下のコマンドで起動します。


$ docker-sync-stack start

これで完了です。ここでお話しした内容はapplepleのgithubに公開されていますので、そちらも参照ください。

appleple/ablogcms-docker

Happy holidays!


関連記事

a-blog cms + Varnish 触ってみる

Docker + a-blog cms

最新記事

カテゴリー

ハッシュタグ