この記事ではDocker Composeを利用したLaravelの開発環境構築を行います。
使用するOSおよびPHP等のバージョンは以下の通りです。
- Mac OS
- PHP7.3
- Laravel5.7
- MySQL5.7
作成する環境は、Nginxのwebサーバ、LaravelのアプリケーションサーバとMySQLのデータベースサーバの3つのコンテナを作成します。
(コンテナを3つ作成するのはそれぞれのコンテナでデータベースとWEBアプリケーション、Webサーバをそれぞれ動作させるためです。)
1. ディレクトリ作成
まず、任意のディレクトリを作成します(この例ではex_laravelというディレクトリを作成します)。
作成したディレクトリの直下にdocker,serverというディレクトリを作成します。
さらにdockerディレクトリの直下にphp,nginxというディレクトリを作成します。
dockerディレクトリには作成するコンテナごとに設定ファイルを保存します。
server直下にはLaravelプロジェクトを作成します。
ここまでのコマンドを整理すると以下のコマンドになります
$ mkdir ex_laravel # 作業ディレクトリを作成
$ cd ex_laravel # 作業ディレクトリに移動
$ mkdir docker # dockerディレクトリを作成
$ mkdir server # serverディレクトリを作成
$ mkdir docker/php #dockerディレクトリ下にphpディレクトリを作成
$ mkdir docker/nginx #dockerディレクトリ下にnginxディレクトリを作成
この時点でのディレクトリの構成は以下のようになります。
ex_laravel (作業ディレクトリ)
├ docker
│ ├ php
│ └ nginx
└ server
最終的なディレクトリの構成は以下のようになります。
ex_laravel (作業ディレクトリ)
├ docker-compose.yml
├ docker
│ ├ php
│ │ ├ php.ini
│ │ └ Dockerfile
│ └ nginx
│ └ default.conf
└ server
2. docker-compose.ymlの作成
ex_laravel/docker-compose.yml
を以下の内容で作成します。
今回は、PHP, nginx, mysqlの3つのコンテナを作成します。
version: '3'
services:
php: # アプリケーションサーバの設定
container_name: php
build: ./docker/php # ./docker/php配下のDockerfileを参照して構築
volumes:
- ./server:/var/www # 開発ディレクトリと公開ディレクトリをマウント
nginx: # WEBサーバのコンテナの設定
image: nginx # nginxの公式イメージを使用
container_name: nginx
ports:
- 80:80 # ゲストとホストそれぞれの80番ポートで接続
volumes:
- ./server:/var/www # 開発ディレクトリと公開ディレクトリをマウント
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf # nginx設定ファイルの指定
depends_on:
- php # nginxコンテナとphpコンテナを連携
db: # DBサーバのコンテナの設定
image: mysql:5.7 # mysqlの公式イメージ使用
container_name: db-host
environment: # DBの設定
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: database
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # コンテナ起動時のコマンドを記述
volumes: # コンテナのDBファイルを./docker/db/に永続化する
- ./docker/db/data:/var/lib/mysql # データベースのデータを永続化するためにホストのボリュームをマウント
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf # MySQLの設定ファイルをマウント
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306 # ゲストとホストそれぞれの3306番ポートで接続
上記のdocker-compose.yml
の中で特に重要な点は、アプリケーションサーバ(phpコンテナ)volumes
の設定になります。
上記のファイルでは、
services:
php: # アプリケーションサーバの設定
container_name: php
build: ./docker/php # ./docker/php配下のDockerfileを参照して構築
volumes:
- ./server:/var/www # 開発ディレクトリと公開ディレクトリをマウント
としており、ホストコンピュータの./serverディレクトリにコンテナの/var/www
の内容がリンクされます。
この設定により、この後で作成するLaravelプロジェクトのファイルがホストコンピュータの./server
ディレクトリに保存されます。
3. Dockerfile作成
phpコンテナ構築時に使われるDockerfileをdocker/php/Dockerfile
に作成します。
Dockerファイル内で、PHPのパッケージ依存管理ツールであるComposerをインストールしています。
Composerのインストール方法についての詳細は公式ドキュメントを参照してください。
# phpのイメージをベースイメージにする
FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/
# 必要なパッケージのインストール
RUN apt-get update \
&& apt-get install -y zlib1g-dev mariadb-client \
&& docker-php-ext-install zip pdo_mysql
#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"
4. PHP設定ファイルの作成
PHPの設定ファイル(php.ini)をdocker/php/php.ini
に作成します。
設定ファイルの内容は以下のように記述します。
タイムゾーンや文字コード、言語の設定をしています。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
5. nginx設定ファイル作成
niginxの設定ファイル(default.conf)をdocker/nginx/default.conf
に作成します。
設定ファイルに以下の内容を記述します。
server {
# Nginxの公開ポートを設定します。
listen 80;
index index.php index.html;
root /var/www/public;
# 全てのリクエストをLaravelに送るための設定
location / {
root /var/www/public;
index index.html index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
6. Laravelプロジェクト作成
dockerを起動して、Laravelプロジェクトを作成してみましょう。
docker-compose.ymlがあるディレクトリに移動して下記のコマンドでdockerを起動してみましょう。
その後dockerに入って、Laravelプロジェクトを作成します。
# docker起動
$ docker-compose up -d
# phpコンテナに入ります
$ docker-compose exec php bash
# Laravelプロジェクト作成
$ laravel new
7. 動作確認
Webブラウザでhttp://localhost:80/にアクセスして、以下のような画面が表示されていれば環境構築は完了です。
サーバを止める場合は、作業ディレクトリで以下のコマンドを実行します。
$ docker-compose stop
8. docker-compose up -d 実行時にphpコンテナのビルドエラーが発生した場合の対処法
docker起動時のdocker-compose up -d
コマンドを実行した時に以下のようなエラーが発生する場合があります。
Could not open input file: composer-setup.php
The command '/bin/sh -c php composer-setup.php' returned a non-zero code: 1
これはDockerfile内で設定しているshaキーのバージョンが異なっているためです。
docker/php/Dockerfile
内の
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
この部分のshaキーa5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1
の部分を、公式ドキュメントを参照して最新のバージョンのshaキーに変更してください。
この記事では、Docker Composeを利用したLaravelの開発環境構築を行いました。