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

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
COPY --from=composer /usr/bin/composer /usr/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の環境設定などは別の機会にご紹介できれば・・・いいな。(笑)

A-Kira
ボルダリングができるエンジニアです(^^)
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