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

  • 101
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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 libpng12-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の日本語設定をします。