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

Docker for MacとDocker ComposeでささっとLAMP環境を作る

More than 1 year has passed since last update.

色々とDockerは便利ですよね(大雑把)。

私は「ちょっとこれを動かしたい」とか思った時にサクッとLAMP環境作って破棄するってのをよくやります。

よく周りに私が使っている「ささっとDockerでLAMP環境構築セット」を勧めるんですが、README的なものが無かったので、今更ですがここにまとめていきたいと思います。

事前準備

Docker for Mac

そもそもDockerが入ってない場合は、Docker for Macでインストールしてみてはどうでしょうか。
docker、docker-compose、docker-machine等の一通り必要なものを揃えることが出来ます。

使用するコンテナ

WEBサーバとDBサーバ、計2つのコンテナを使用してLAMP環境を構築していきます。

  • WEBサーバ
    Docker HubにあるPHPの公式リポジトリ: php:7.1-apache

  • DBサーバ
    Docker HubにあるMySQLの公式リポジトリ: mysql:5.7

上記の2コンテナをまとめて管理する為、Docker Composeを使用します。

LAMP環境構成

下記の構成で環境構築を行っていきます。
もちろんPHPやMySQLのバージョンは、色々変えられます。

  • Debian 8.8
  • Apache 2.4.10
  • PHP 7.1.5
  • mysql 5.7.18

ディレクトリ構成

人それぞれ、色々なやり方が有るとは思いますが、
私の場合は大きく3つのディレクトリで区切っています。

$ tree -L 2
.
└── web                 -> WEBサーバ用ディレクトリ
│  ├── Dockerfile
│  ├── base.conf        -> Apacheの設定ファイル
│  └── php.ini
├── db                  -> DBサーバ用ディレクトリ
│   ├── Dockerfile
│   ├── my.cnf
│   └── mysql_data      -> MySQLのデータ格納用ディレクトリ
├── docker-compose.yml
└── html                -> 作業ディレクトリ

各設定ファイル

各設定ファイルをさらっと説明していきます。

./docker-compose.yml

version: '2'
services:
  db:
    build: ./db
    volumes:
      - ./db/mysql_data:/var/lib/mysql -> (1)
    environment:
      MYSQL_ROOT_PASSWORD: 'password'  -> (2)
  web:
      build: ./web
      ports:
        - '8080:80'                    -> (3)
      volumes:
        - ./html:/var/www/html         -> (4)
      depends_on:
        - db
  1. 通常、MySQLのコンテナを削除するとデータも消えてしまう為、volumeオプションを使用してローカルのmysql_dataディレクトリにデータを残すようにします
  2. MySQLのrootユーザの設定もここで行っているので、適宜passwordを設定してください
  3. port:8080をDockerのport:80に紐付けてますが、適宜変更してください
  4. html配下をドキュメントルートにしています

./web/Dockerfile

WEBサーバの設定ファイルです。
Docker HubにあるPHPの公式リポジトリ: php:7.1-apacheを使用します。

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 libpng12-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

Apacheの設定ファイルです。

<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

PHPの設定ファイルです。

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

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

./db/Dockerfile

DBサーバの設定ファイルです。
Docker HubにあるMySQLの公式リポジトリ:mysql:5.7を使用します。

FROM mysql:5.7
MAINTAINER docker-db

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

./db/my.cnf

MySQLの設定ファイルです。

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

環境構築方法

コンテナをビルドする

$ docker-compose build

コンテナを起動する

$ docker-compose up -d

コンテナの起動を確認する

WEBとDBコンテナのステータスがUpになっていることを確認します。

$ docker-compose ps
    Name                   Command               State          Ports        
-----------------------------------------------------------------------------
docker_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp            
docker_web_1   docker-php-entrypoint apac ...   Up      0.0.0.0:8080->80/tcp

ブラウザでアクセスする

今回作成したWEBサーバは、サブドメインでドキュメントルートを切り替えられるようにしています。

例えば、./html/sampleをドキュメントルートにしたい場合は、
ブラウザからhttp://sample.localhost:8080でアクセスします。

また、./html/sample/publicをドキュメントルートにしたい場合は、
http://public.sample.localhost:8080でアクセスします。

この辺りの設定は、./web/base.confに記載されています。

その他

私はよくhtml配下にphpMyAdminを置いてMySQLを操作しています。
Dockerにログインして作業するのも手間ですからね。

ciloholic
色々エンジニアしてます。
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
ユーザーは見つかりませんでした