【Web開発】Docker+Nginx+PHP(laravel)で開発環境構築をする手順

#技術系
written by ま。

Webアプリケーションの作成で主流となっているPHPですが、私もWebエンジニアをしていると最近はPythonやJavaよりもPHPに触れる機会の方が多いような気がします。
今回もお仕事内でDockerにLaravelを入れて動かすような構築をしたので、その手順を備忘録として残そうかなと思います。

Dockerってなんぞ?

そもそもDockerって何?って方向けに記載しておきます。もう理解してるぜ!って方は読み飛ばしてください。

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。

引用;ウィキペディア

なるほど。分からん。

おおよそその反応で良いと思います。Dockerって何?と聞かれて100点の回答が必要な場合だけこの文章を回答すればよいと思います。
簡単な理解をしたいだけの場合は、

構築に必要なコードを記述しておけば、環境にかかわらずコマンドを実行するだけでアプリケーションを展開できるもの。

と覚えとくだけで良いかと思います。
「環境にかかわらず」という点が重要で、どんな種類のサーバーであろうとDockerのコンテナ(※後述)さえ構築できれば同様にかつ簡単に動作することが最大のメリットだからです。

またその中でイメージという言葉とコンテナという言葉が出てきます。

イメージ・・・アプリケーションがインストールされたテンプレート。要するにプロジェクトのファイル構成そのものです。

コンテナ・・・実行環境を他のプロセスから隔離し、その中でイメージから構築されたアプリケーションを動作させるもの。

繰り返しになりますが、必要な処理やインストールするものの記載だけ書いておけば(イメージ)、コマンド実行で勝手にインストールしてサーバー(コンテナ)として立ち上げてくれます。
先人ののこしたドキュメントなどを見て一つ一つインストールして構築するのではなく、1回作ればコマンドだけで構築完了!というわけです。

では具体的な方法を見ていきましょう。

Docker+PHP(Laravel)の構築手順

基本的にWindows前提で記載しますので、Macでもほぼ同じですがインストール物などだけ間違わないようにしてください。

①Dockerインストール
https://www.docker.com/products/docker-desktop

インストール後起動。(デフォルトでインストールすると勝手に起動します)

②プロジェクトディレクトリ・ファイルの作成

任意の場所に以下の構成でディレクトリとファイルを作成してください。

/project #プロジェクト名
├─ /docker
| ├─ /nginx
|   └─ default.conf 
| └─ /php
|   ├─ Dockerfile 
|   └─ php.ini 
├─ /laravel-project #実際のWebAppコード
└─ docker-compose.yml

③ファイル編集

先ほど作成したファイルを編集していきます。
詳しい解説は難しいので、大幅に割愛しますが重要なところだけ説明を加えていきます。
こちらのサイトがわかりやすいので参考にしてください。

まず、php.ini
こちらはPHPの設定ファイルです。

[Date]
#タイムゾーンの設定
date.timezone = "Asia/Tokyo"

[mbstring]
#文字コードの設定
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[opcache]
#phpの動作に関する設定(PHP公式おすすめ設定)
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

phpの動作に関する設定については、同じコードの解析を晴らしてPHPを高速化しようという動きがされるらしいです。
参考:https://www.php.net/manual/en/opcache.installation.php

続いて、Dockerfile
こちらはイメージを生成する際に使われるファイルで、コマンドが記載されています。

FROM php:7.3-fpm 
COPY php.ini /usr/local/etc/php/
RUN apt-get update && apt-get install -y \
zlib1g-dev \
libzip-dev \
vim \
&& docker-php-ext-install zip pdo_mysql opcache
WORKDIR /var/www
COPY --from=composer /usr/bin/composer /usr/bin/composer 
ENV COMPOSER_ALLOW_SUPERUSER 1 
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
RUN composer global require "laravel/installer"

Laravelをインストールできるようにcomposerを導入しています。

続いて、default.conf
Nginxの設定です。


server {
  listen 80;
  root /var/www/laravel-project/public;
  index index.php;
  
  location / {
    root /var/www/laravel-project/public;
    index index.php;
    try_files $uri $uri/ /index.php$query_string;
  }
  
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000; 
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

ポート番号の指定やディレクトリルートの指定を行っています。
rootの設定ですがNginx内でのディレクトリ構造に合わせて書かれています。
実際に開発段階に入った際には/laravel-project #実際のWebAppコード内で対応することになります。

最後に、docker-compose.yml
コンテナを立ち上げる際の設定です。

version: '3'
version: '3'
services:
  app:
    container_name: app  
    build: ./docker/php
    volumes:
      - .:/var/www
  nginx:
    image: nginx 
    container_name: nginx
    ports:
      - 8000:80 
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www
    depends_on:
      - app
  db:
    image: mysql:5.7 
    container_name: db
    environment: 
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: db-user
      MYSQL_PASSWORD: db-pass
      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

ファイルに記載すべきことは以上になります。

④Docker起動

起動コマンド。ymlがあるディレクトリで実行します。
初回起動時にいろいろとインストールが始まります。

docker-compose up -d

プロセス確認コマンド
app、db、nginxの3つのプロセスが立ち上がり、STATUSの欄がrunningもしくはupとなっていれば起動できています。

docker-compose ps

⑤Laravelインストール

以下のコマンドでコンテナ内に入ります。

docker-compose exec app bash

Laravelのインストールを以下のコマンドで行います。バージョン指定は適宜変更してください。

composer create-project --prefer-dist laravel/laravel laravel-project "6.*"

⑥確認

Laravelがインストールされたら、docker-compose.ymlで指定したNginxでのポートにアクセスしてみましょう!

Laravelのデフォルト画面が出れば成功です!
その際パーミッションエラーなどが出る際は対象のフォルダの権限を操作してあげてください。対応方法はこちら

localhost:8000

おわりに

事細かな説明を取っ払って、構築手順に重きを置いて説明してまいりましたが、
より便利な様々な設定ができたりするのでいろんなサイトを見て調べてみてください。

別の機会には、ここで作成したプロジェクトから実際に自身の書いたコードを動かすまでを題材としてブログ書こうと思います。

ありがとうございました!