HAM MEDIA MEMO

a-blog cms のローカル開発環境をDockerで用意してみた

a-blog cmsの開発環境、みんなどうしているのか?

MAMPやXAMPPで立てているか、レンタルサーバー借りて入れている方法多い様子。

製作者一人で完結するような場合はそれでも問題ないのが、複数の人が対応するような案件では、環境に違いがでてきてしまったりするため、準備に手間がかかってしまう。

a-blog cms 案件であってもそうでなくとも、ローカルの開発環境を同一の状態で共有できるようにしてあるのは、チーム開発の現場として重要になると思ってる。 簡易に共有するために、最近は Docker を使うようになった。

Enterprise Container Platform | Docker

DockerをPCにインストールしている状態で、設定ファイルだけ共有してあれば、サーバーの環境もコマンド一つで起動するようになりまし、そしてなにより、以前利用していた Vagrant よりも導入も利用時の重さも気にならない。

MAMPも使っていたのだが、共有には不向きだったので(設定は個別に対応が必要のため)チームで制作する場合に共有しやすい方法をとるために、 Docker での方法を模索することに。

MAMPは無料版を使っていた私

以前の私のブログで書いていた内容で、当時からMAMPも無料版しか利用したことがない。

MAMPを使ってMacのローカルで複数サイトのバーチャルホストを設定する方法 | THE HAM MEDIA BLOG

MAMPを使ってローカルで複数サイトのバーチャルホストを設定&イントラ環境や仮想環境からもそのサイトを確認する設定方法 | THE HAM MEDIA BLOG

MAMPの有料版を使うのが良かったかもしれないが、おかげで今は本格的でないにしても、サーバーの設定や調整くらいはできるようになった。

今の自分なら、有料版を買ってしまうところだが、今でも無料版の設定変更だけで手間も少なめで不自由なく使えるようになったので、MAMPに関してのみ、今後も無料版程度の利用に。なぜかって?MAMPの設定の共有を案件ごとにチームで共有するほうが手間なのと、人により設定が変わってしまう可能性があるためだ。

できる限り設定なども共有できるならできるようにしていきたい。

a-blog cms の Dockerってあるの?

まずは先人の知恵をお借りするために検索。

Docker環境 | a-blog cms developer

さすが本家CTO!

参考のとおりに docker-compose.yml ファイルを用意。中身は丸パクリをまずは試みる。細かいことは省いて、設定にかいてある VIRTUAL_HOSTacms.labhosts の設定に追加。

その後にコマンドで動かしてみる。

ちなみにDocker自体の説明は省略。

$ docker-compose up -d
Creating network "ablogcms_test_default" with the default driver
Creating ablogcms_test_mysql_1 ... done
Creating ablogcms_test_proxy_1 ... done
Creating ablogcms_test_www_1   ... error

ERROR: for ablogcms_test_www_1  Cannot start service www: b'Mounts denied: \r\nThe path /etc/localtime\r\nis not shared from OS X and is not known to Docker.\r\nYou can configure shared paths from Docker -> Preferences... -> File Sharing.\r\nSee https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.\r\n.'

ERROR: for www  Cannot start service www: b'Mounts denied: \r\nThe path /etc/localtime\r\nis not shared from OS X and is not known to Docker.\r\nYou can configure shared paths from Docker -> Preferences... -> File Sharing.\r\nSee https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.\r\n.'
ERROR: Encountered errors while bringing up the project.

エラー文をみると、localtimeがうんたらかんたら。

ということで検索。

Dockerで- /etc/localtime:/etc/localtime:ro がMount Deniedを出すやつ - Steady WorX はてな

環境変数の書き方が古いようなので(2018年12月3日現在)/etc/localtime:/etc/localtime:roenvironment の項目に TZ: "ls -la /etc/localtime | cut -d/ -f8-9" で追加。これでエラーも解消され、 www のディレクトリが出来上がる。

docker-compose.yml

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:7.2 # phpのバージョンにあったものを指定
        privileged: true
        volumes:
            - ./www:/var/www/html # host, guest間のファイル同期
        links:
            - mysql:mysql
        environment:
            - VIRTUAL_HOST=acms.lab,www.acms.lab # host名を指定
            - APACHE_DOCUMENT_ROOT=/var/www/html # ドキュメントルートを指定
            - TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

www に a-blog cms の中身をいれる

起動したあとに、 a-blog cms のインストールファイルを落としてきてから入れる。

ダウンロード | a-blog cms developer

htaccess.txt のファイルを .htaccess に変更も忘れずに。

アクセスするURL

アクセスをするURLは、先程 hosts に登録しておいたドメイン、 acms.labhttp://acms.lab

アクセスをすると、インストールの画面がでてくるので、進める。

データベースサーバー名には注意

データベースの設定にいくと、データベースサーバー名には localhost などが入っているが、 Docker の mysql のコンテナを別にしているため、 localhost ではつながらない。

どうしたらよいかというと、 docker-compose.yml の services につけたデータベースのコンテナの名前、今回でいうと mysql をつける。データベースは作っていないので、何かしらデータベース名をいれて、その下のチェックボックス、 データベースが存在しなかった場合に、指定された名前でデータベースを作成する にチェックをいれておく。

ユーザー名は特に指定していないので、デフォルト root をいれ、パスワードは、設定に MYSQL_ROOT_PASSWORD で入れた root を使う。

問題がなければそのまま設定を進められる。

Dockerを止める場合は

現状の設定のままだと、Dockerをとめるとアクセス出来なくなってしまう。 $ docker-compose stop 後からの $ docker-compose start も表示されず、 $ docker-compose down をしてしまうと、今の設定だと、データベースがまっさらな状態に戻ってしまう。

まっさらな状態に戻ったあとにアクセスしても、データベースが見つからないのでエラーになってしまう。

この状態になってしまったら setup ディレクトリ名をもどして、再度インストールをし直す必要がでてくる。

それは面倒なので、データベースのデータも永続化するために、ローカルに保存されるように設定を加える。

docker-compose.yml 抜粋

# mysql
    mysql:
        image: mysql:5.7
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root

mysql の部分だけを抜粋すると volumes を加えることで、上記の例だと ./db/mysql_data のディレクトリにデータが残ることになる。

再度インストールからすすめる必要があるが、ローカルにデータベースを残すことで、一度 $ docker-compose down をしてもデータは消えずに $ docker-compose up -d で再びデータが入った状態で進めることができるので、インストール後からの表示になり、設定を加えても消えることはない。

今回調整した docker-compose.yml 完全版

docker-compose.yml

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:7.2 # phpのバージョンにあったものを指定
        privileged: true
        volumes:
            - ./www:/var/www/html # host, guest間のファイル同期
        links:
            - mysql:mysql
        environment:
            - VIRTUAL_HOST=acms.lab,www.acms.lab # host名を指定
            - APACHE_DOCUMENT_ROOT=/var/www/html # ドキュメントルートを指定
            - TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

共有データに注意

データベースの中身をローカルに残せたとしても、それらのファイルをそのまま共有するのは、ファイル数が膨大になる点をふくめ良くない。

共有する場合は、移動した setup の機能にあるエクスポートなどを利用して行うように。

エクスポートをしなくとももう少しここも効率化できると良さそうなのだが、私の知見も少ないため、まだそのあたりの効率化には至っていない。この点についてはもう少し勉強してみたいと思う。

簡易な説明になってしまったが、a-blog cmsのローカル環境をDockerで作成する流れを、自分の備忘録も兼ねてざっとだけ書いてみた。Dockerについては私もまだまだ勉強中なので、もう少し細かな設定があれば試すようにしたい。

また、上記に紹介した手直しした例は一例で、すこし設定を変更したものを GitHub(h2ham/ablogcms-docker)上にあげてある。サッと作ったものを共有しただけなので、問題箇所があるかもしれないが、活用できたらそちらも利用して欲しい。