ほぼ2年ぶりの投稿になっている今回、この記事は a-blog cms Advent Calendar 2018 の 3日目の内容。
先日開催された a-blog cms Training Camp 2018 TOKYO のLTでも発表した内容で、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_HOST
の acms.lab
を hosts
の設定に追加。
その後にコマンドで動かしてみる。
ちなみに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:ro
を environment
の項目に 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 のインストールファイルを落としてきてから入れる。
htaccess.txt
のファイルを .htaccess
に変更も忘れずに。
アクセスするURL
アクセスをするURLは、先程 hosts
に登録しておいたドメイン、 acms.lab
、 http://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)上にあげてある。サッと作ったものを共有しただけなので、問題箇所があるかもしれないが、活用できたらそちらも利用して欲しい。
- Enterprise Container Platform | Docker
- a-blog cms Advent Calendar 2018
- a-blog cms Training Camp 2018 TOKYO
- MAMPを使ってMacのローカルで複数サイトのバーチャルホストを設定する方法 | THE HAM MEDIA BLOG
- MAMPを使ってローカルで複数サイトのバーチャルホストを設定&イントラ環境や仮想環境からもそのサイトを確認する設定方法 | THE HAM MEDIA BLOG
- Docker環境 | ローカル環境 | ドキュメント | a-blog cms developer
- Dockerで- /etc/localtime:/etc/localtime:ro がMount Deniedを出すやつ - Steady WorX はてな
- h2ham/ablogcms-docker