Docker Composeを使用したLaravelの開発環境構築

投稿者: | 2019-09-09
Table of Content

この記事では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の開発環境構築を行いました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です