⏲️

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

2021/07/04に公開

色々と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に記載されています。

Discussion