Edited at

Dockerを使ってLaravel開発環境構築


はじめに

今回はDockerを使ってnginx上でPHP実行環境を構築し、Laravel新規プロジェクト作成までを行います。


環境

Dockerとdocker-composeは用意できている前提です。

Docker version 18.06.0-ce

docker-compose version 1.22.0


構成

以下の構成を想定しています。

project

├ docker-compose.yml

├ docker

│  ├ php

│  │  ├ php.ini

│  │  └ Dockerfile

│  └ nginx

│    └ default.conf

└ server


構築

環境構築の手順を解説を簡単に交えながら紹介していきます。


1. ディレクトリ作成

まず、任意のディレクトリ(上記ではproject)を作成します。

その直下にdocker, serverを作成します。server直下にLaravelプロジェクトを作成します。


2. docker-compose.yml作成

今回は、PHP, nginx, mysqlの3つのコンテナを想定しておりますので、以下のようになります。


docker-compose.yml

version: '3'

services:
php:
container_name: php
build: ./docker/php
volumes:
- ./server:/var/www

nginx:
image: nginx
container_name: nginx
ports:
- 80:80
volumes:
- ./server:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php

db:
image: mysql:5.7
container_name: db-host
environment:
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:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306



解説

各コンテナ共通として、container_nameでコンテナ名を付けています。

phpコンテナ

build: project/docker/php配下のDockerfileを参照して構築

volumes: 開発ディレクトリと公開ディレクトリをマウント

nginxコンテナ

image: nginxの公式イメージを使用

ports: ゲストとホストそれぞれの80番ポートで接続

volumes: 開発ディレクトリと公開ディレクトリをマウント & nginx設定ファイルの指定

depends_on: nginxコンテナとphpコンテナを連携

mysqlコンテナ

image: mysqlの公式イメージ使用

restart: コンテナ再起動

environment: DBの設定

ports: ゲストとホストそれぞれの3306番ポートで接続


3. Dockerfile作成

phpコンテナ構築時に使われるDockerfileをdocker/php/に作成します。

Composerのインストールは公式を参考にしてください。


Dockerfile


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の設定ファイルをdocker/php/に作成します。以下、最低限の設定ですのでプロジェクトに応じて変更してください。


php.ini

[Date]

date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"


5. nginx設定ファイル作成

niginxの設定ファイルをdocker/nginx直下に作成します。以下はLaravelでの運用を前提に記載しています。


default.conf

server {

listen 80;
index index.php index.html;
root /var/www/public;

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

server以下にLaravelの各ディレクトリやファイルができています。


7. 動作確認

ブラウザからlocalhostにアクセスしてみましょう。以下のようにLaravelの画面が立ち上がっていれば成功です。

スクリーンショット 2018-09-30 21.19.02.png

MySQLのコンテナも確認しておきましょう。

# mysqlコンテナに入ります

$ docker exec -it db-host bash

root@3fe3c5295b72:/# mysql -u root -p
Enter password: パスワード入力します
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.12 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


まとめ

いかがでしたでしょうか?

今流行りのdockerとLaravelでの開発環境構築です。

簡単にできるのでぜひ、一度構築してみてください。

Laravelの環境設定などは別の機会にご紹介できれば・・・いいな。(笑)