Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
255
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@naga3

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
255
Help us understand the problem. What are the problem?