DockerでLAMP環境構築~cakephp3のインストールまで

これまでMAMPで開発していたプロジェクトをDocker化したので、その備忘録です。

作ったものは下に置いています。

https://github.com/shnr/docker_lamp_2

Dockerコンテナ作成

今回作成する環境

php 7.1
mysql 5.6
cakephp3.4
phpmyadmin

ディレクトリ構成

どのようにでも出来そうですが、下の記事がわかりやすかったので参考にさせてもらいました。
https://qiita.com/ciloholic/items/c9bbb604d8338551b5dc

    ├── db
    │   ├── Dockerfile
    │   ├── my.cnf
    │   └── mysql_data
    ├── docker-compose.yml
    ├── html
    │   └── www
    └── web
        ├── Dockerfile
        ├── base.conf
        └── php.ini

各設定ファイルの作成

下準備

プロジェクトのルートに移動し、各ディレクトリを作成します。

$ cd ~/Dev/proj/docker
$ mkdir db
$ mkdir web
$ mkdir html

docker-compose

webのvolumesで、:cached オプションをつけることでMac on dockerのもっさり感が軽減されました。
PMA_HOST はコンテナ立ち上げ後に取得出来るようでした。なので後ほど書き換えます。

$ vim docker-compose.yml

version: '2'
services:
  web:
      build: ./web
      ports:
        - '8080:80'
      volumes:
        - ./html:/var/www/html:cached
      depends_on:
        - db
  db:
    build: ./db
    volumes:
      - ./db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'password'

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=password
    restart: always
    links:
      - db
    ports:
       - 8888:80
    volumes:
       - /sessions

web/Dockerfile

今回はphp7.1です。
モジュール等は都度調整すれば良さそうです。

$ vim web/Dockerfile

FROM php:7.1-apache
MAINTAINER docker-web

RUN apt-get update \
    && apt-get -y install vim wget lsb-release libicu-dev mysql-client libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-install pdo_mysql mysqli intl gd
RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
RUN ln -s /etc/apache2/mods-available/vhost_alias.load /etc/apache2/mods-enabled
RUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && a2enconf fqdn

COPY ./base.conf /etc/apache2/sites-available/base.conf
RUN a2ensite base.conf

COPY ./php.ini /usr/local/etc/php/

web/base.conf

ディレクトリをサブドメイン化出来る設定でした。

$ vim web/base.conf

<VirtualHost *:80>
    ServerName localhost
    ServerAlias *.*.localhost
    VirtualDocumentRoot "/var/www/html/%2/%1"
</VirtualHost>

<VirtualHost *:80>
    ServerName localhost
    ServerAlias *.localhost
    VirtualDocumentRoot "/var/www/html/%1"
</VirtualHost>

web/php.ini

$ vim web/php.ini

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese

db/Dockerfile

$ vim db/Dockerfile

FROM mysql:5.6
MAINTAINER docker-db

COPY ./my.cnf /etc/mysql/conf.d/my.cnf

db/my.cnf

$ db/my.cnf

[mysqld]
character-set-server=utf8
datadir = /var/lib/mysql

ビルド

ここでビルドする。

$ docker-compose build
$ docker-compose ps

これで、/html/www/index.html などでファイルを作れば、 http://www.localhost:8080/ のようにアクセスが可能になります。

次に、phpmyadminやアプリケーション側でのホスト設定のため、mysqlホスト名を確認します。

ログイン

execコマンドでサーバへログイン。

$ docker exec -it docker_lamp_db_1 /bin/sh

ホスト名を確認する。

mysql> select @@hostname;
xxxxxxxxxxxxxxx

docker-compose.ymlのPMA_HOSTを書き直します。

$ vim docker-compose.yml

...
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=xxxxxxxxxxxxxxx
      - PMA_USER=root
      - PMA_PASSWORD=password

phpmyadminのみ、再度ビルド。

$ docker-compose build phpmyadmin
$ docker-compose up -d phpmyadmin

http://localhost:8888/index.php

OK!

Cakephp3のインストール

これで基本的なLAMP環境ができたので、アプリケーションのインストールを行います。
composerからのインストール。

$ cd html/
$ curl -sS https://getcomposer.org/installer | php

今回は3.4.5なので、バージョンを指定。 ※指定がなければ最新版が入る。

$ php composer.phar create-project --prefer-dist cakephp/app:3.4.5 msid

成功すれば、http://www.localhost:8080/ でデフォルト画面が表示されます。

既存cakephp3プロジェクトの移行

まずダンプデータをを取得、./db/mysql_data 配下に格納しました。
docker-compose.ymlで定義しているように、ここがコンテナ内の /var/lib/mysql/ となります。

DBコンテナにログインして、

$ docker exec -it docker_lamp_db_1 /bin/sh

DB作成

$ mysql -u root -p
mysql> CREATE DATABASE newdb;

復元

mysql -u root -p newdb < /var/lib/mysql/login_system.sql

perfect.

そして、ファイルをしかるべきところへ移し、DB設定も変更すれば、

            'host' => 'xxxxxxxxxxxxxxx',
            'username' => 'root',
            'password' => 'password',

無事移行完了となりました。