Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

naga3
最近はIT講師が多い似非プログラマです。 自サイトでいろんな言語の入門をやっています。
http://ponk.jp
scouty
「あらゆる事象を必然化し、 世の中のミスマッチをなくす」ことをミッションとし、AIヘッドハンティングサービスを開発・運営するスタートアップ
https://lapras.com
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした