Edited at

Docker Composeを使ってLAMP環境を立ち上げる


Docker Composeとは

Docker Hubのオフィシャルイメージを使ったLAMP環境構築でLAMP環境を構築することは出来たのですが、複数のコンテナの順番を意識して立ち上げなければならないので、手順書やシェルスクリプトなどを書く必要があり面倒です。

それを解決するためにDocker Composeというツールを使うことにしました。複数のコンテナを管理して、立ち上げる順番やコンテナに渡すパラメータを指定することができるツールです。


使ってみる

https://github.com/naga3/docker-lamp こちらに一式まとめてあります。

先にDockerとDocker Composeをインストールしておいてください。


Dockerのインストール

curl -fsSL https://get.docker.com/ | sh

参考: https://docs.docker.com/linux/step_one/


Docker Composeのインストール

curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

参考: https://docs.docker.com/compose/install/


LAMP環境の起動

適当なディレクトリで

git clone https://github.com/naga3/docker-lamp.git

cd docker-lamp/
docker-compose up -d

これでLAMPを構成する複数のコンテナが自動的に立ち上がります。

ウェブブラウザでphpinfoの画面が出ることを確認してください。

ポートがぶつかる場合は、docker-compose.ymlのportsの左側の80を変更してください。


docker-compose.yml

使うコンテナやパラメータなどを記述した手順書です。YAML形式なのでインデントに注意してください。


docker-compose.yml

version: '2'

services:
mysql:
build: ./mysql
environment:
MYSQL_ROOT_PASSWORD: pass
volumes:
- db:/var/lib/mysql
php:
build: ./php
ports:
- '80:80'
volumes:
- ./html:/var/www/html
depends_on:
- mysql
volumes:
db:


docker-compose.yml : mysqlサービス

    build: ./mysql

mysql/Dockerfileの内容を元にイメージをビルドします。Dockerfileの内容については後述します。

    environment:

MYSQL_ROOT_PASSWORD: pass

環境変数でMySQLのパスワードを指定します。docker runの-eオプションに対応します。

    volumes:

- db:/var/lib/mysql

データベースの内容を永続化するために名前付きデータボリュームdbを設定します。docker inspectコマンドでデータボリュームの場所が分かります。


docker-compose.yml : phpサービス

    build: ./php

php/Dockerfileの内容を元にイメージをビルドします。Dockerfileの内容については後述します。

    ports:

- '80:80'

ホスト側の80番ポートとコンテナ側の80番ポートを結びつけます。

YAMLの60進数時刻フォーマットと誤認識しないようにクォーテーションで囲んでいます。

    volumes:

- ./html:/var/www/html

ホスト側のhtmlディレクトリをコンテナ側のドキュメントルートにマウントします。ここにコンテンツを置きます。

    depends_on:

- mysql

phpサービスがmysqlサービスに依存していることを示します。これによりmysqlコンテナを先に立ち上げ、またphpコンテナ側からmysqlコンテナにアクセスできるようになります。


mysql/Dockerfile

FROM mysql:5.7

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

FROM mysql:5.7

Docker Hubの公式MySQLイメージをベースイメージとします。

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

ホスト側の./my.cnfファイルをコンテナ側の/etc/mysql/conf.d/にコピーします。/etc/mysql/my.cnfの最後にこのディレクトリをインクルードしているのでMySQL起動時に設定が反映されます。


mysql/my.cnf

[mysqld]

character-set-server=utf8

character setをUTF-8にしています。


php/Dockerfile

FROM php:7-apache

COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt

FROM php:7-apache

Docker Hubの公式PHPイメージをベースイメージとします。

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

ホスト側にあるphp.iniをコピーしてコンテナ側のphp.iniとして設定します。

RUN apt-get update \

&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt

必要そうな拡張機能を導入します。docker-php-ext-installphpイメージに含まれる拡張機能を導入するユーティリティです。


php/php.ini

[Date]

date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

タイムゾーンとmbstringの日本語設定をします。