Docker+LEMP環境構築

Laravel

本記事は自己学習用に作成したDocker+LEMP環境でLaravelを動作させるまでの環境構築手順になります。
執筆時点(2022/3)で最新のバージョンで構築しました。

環境

構築環境

  • Windows 10
  • Docker Compose v2.2.3
  • Nginx 1.21.5
  • PHP 8.1.4
  • Composer 2.2.9
  • MySQL 8.0.28
  • Laravel 9

利用ツール

  • Git Bash

Bashシェルが実行できればOKです。
手順に出てくるコマンドはこちらのツールを利用して実行しています。

構築手順

事前準備

Docker Desktop for Windowsのインストール

下記URLよりインストーラーをダウンロードしてください。

Install Docker Desktop on Windows
Get started with Docker for Windows. This guide covers system requirements, where to download, and instructions on how to install and update.

下記画面の赤枠をクリックすることでダウンロードが始まります。

Docker Desktop for Windowsのインストールサイト

インストーラーの実行

上記手順でダウンロードした「Docker Desktop Installer.exe」を実行
インストール・ウィザードの指示に従いインストールを進めます。

インストールの確認

下記コマンドを実行しDocker Composeのバージョンが表示されればOKです。

$ docker-compose -v
Docker Compose version v2.2.3

作業用ディレクトリ作成

ターミナル上で開発環境を配置したいディレクトリに移動しておいてください。
その後手順に沿って必要なディレクトリを作成していきます。

好きな名前でディレクトリを作ってください(プロジェクト名にあたると思ってください)
以降こちらのディレクトリのことを作業ディレクトリと呼びます。

$ mkdir example

作業ディレクトリ内に移動

$ cd example

Docker用の設定ファイルを格納するディレクトリを作成

$ mkdir docker

dockerフォルダと同じ階層ににLaravelインストール用のディレクトリを作成

$ mkdir src

dockerディレクトリ内へ移動

$ cd docker

各コンテナ設定ファイルを格納するためのディレクトリを作成

$ mkdir nginx php mysql

ここまでのディレクトリ構成は下記になります。

example
├─docker
│  ├─mysql
│  ├─nginx
│  └─php
└─src

Docker設定

環境設定ファイルの作成

コンテナ起動時に読み込む環境変数を定義します。

作業ディレクトリ直下に「.env」ファイルを作成

$ touch .env

ファイル内容

# NGINX設定
HTTP_PORT=8080

# DB設定
DB_NAME=example_db
ROOT_PASSWORD=password
USER_NAME=example
USER_PASSWORD=example_password

docker-compose.ymlの作成

利用するサービスの設定内容を記載するファイル。
今回の環境で言うと、Nginx、PHP、MySQLにあたります。

作業ディレクトリ直下に「docker-compose.yml」ファイルを作成

$ touch docker-compose.yml

ファイル内容

version: '3.8'

volumes:
  mysql-volume:

services:
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - ${HTTP_PORT}:80
    volumes:
      - ./src/:/var/www/html
  php:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    volumes:
      - ./src/:/var/www/html
  mysql:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    volumes:
      - mysql-volume:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD}
      - MYSQL_USER=${USER_NAME}
      - MYSQL_PASSWORD=${USER_PASSWORD}
      - TZ=Asia/Tokyo

${XXX}の値は先ほど作成した.envに記載されている内容を参照します。

設定項目の詳細を知りたい方は下記Docker Composeファイルのリファレンスを参照してください。

Docker Composeリファレンス

Dockerfileの作成

ビルド実行時に読み込まれる設定ファイル
読み込むコンテナの定義やコンテナにコピーしたい設定ファイル等の記述を行います。

Nginx

「作業ディレクトリ/docker/nginx/」配下に「Dockerfile」ファイルを作成

$ touch docker/nginx/Dockerfile

ファイル内容

FROM nginx:1.21

COPY ./docker/nginx /*.conf /etc/nginx/conf.d/
PHP

「作業ディレクトリ/docker/php/」配下に「Dockerfile」ファイルを作成

$ touch docker/php/Dockerfile

ファイル内容

FROM php:8.1-fpm

COPY ./docker/php/php.ini /usr/local/etc/app/php.ini

# Composerのインストール(Laravelのインストールに使う)
COPY --from=composer:2.2.9 /usr/bin/composer /usr/bin/composer

# Composerでlaravelをインストールする時に必要
RUN apt-get update && apt-get install -y \
    zip \
    unzip

# Laravelに必要な拡張機能
RUN docker-php-ext-install bcmath \
    pdo_mysql

WORKDIR /var/www/html

Laravelに必要な拡張機能については下記Laravel公式ドキュメントを参照

Laravel公式ドキュメント – サーバー要件

ただ、php:8.1-fpmのイメージですでにインストールされているものがあるためその辺を除外したものをインストールしています。

php:8.1-fpmイメージ(GitHub) – Available Modules

MySQL

「作業ディレクトリ/docker/mysql/」配下に「Dockerfile」ファイルを作成します。
作業ディレクトリ内に移動して下記コマンド実行

$ touch docker/mysql/Dockerfile

ファイル内容

FROM mysql:8.0.28

COPY ./docker/mysql/my.cnf /etc/my.cnf

各サービスの設定ファイル作成

Nginx

「作業ディレクトリ/docker/nginx/」配下に「default.conf」ファイルを作成

$ touch docker/nginx/default.conf

ファイル内容

server {
    listen 80;
    listen [::]:80;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Laravelに必要なNginxの設定も公式ドキュメントに載っているのでご参照ください。
ハイライトされている行が公式ドキュメントから変更している点です。

Laravel公式ドキュメント – サーバ設定

PHP

「作業ディレクトリ/docker/php/」配下に「php.ini」ファイルを作成

$ touch docker/php/php.ini

ファイル内容

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
MySQL

「作業ディレクトリ/docker/mysql/」配下に「my.cnf」ファイルを作成

$ touch docker/mysql/my.cnf

ファイル内容

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

ここで一度ディレクトリ構造の確認

example
│  docker-compose.yml
│  .env
│
├─docker
│  ├─mysql
│  │      Dockerfile
│  │      my.cnf
│  │
│  ├─nginx
│  │      default.conf
│  │      Dockerfile
│  │
│  └─php
│          Dockerfile
│          php.ini
│
└─src

このような階層になっていれば設定ファイルの配置はOKです。

Dockerの起動

Dockerのビルド

$ docker-compose build

コンテナを起動

$ docker-compose up -d
Creating network "example_default" with the default driver
Creating example_nginx_1 ...
Creating example_mysql_1 ...
Creating example_php_1   ...
Creating example_nginx_1 ... done
Creating example_php_1   ... done
Creating example_mysql_1 ... done

nginx、php、mysqlがdoneとなればOKです

コンテナが起動しているか確認

$ docker-compose ps
     Name                    Command               State                 Ports
--------------------------------------------------------------------------------------------
example_mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
example_nginx_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp
example_php_1     docker-php-entrypoint php-fpm    Up      9000/tcp

State列がUpとなっていればコンテナが起動しています。

Laravel

インストール

PHPのコンテナへ入る

$ winpty docker-compose exec php bash

Git Bashを使っている場合は下記エラーが出ると思うので「winpty」を付けています。
「winpty」を外して実行してみて、問題ないようであれば以降の手順では外した状態に読み替えて実行してください。

the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'

Laravelのインストール

# composer create-project "laravel/laravel=9.*" .

起動確認

下記URLでアクセスしてみて、Nginxの初期画面が表示されればOKです。

http://localhost:8080/
Nginx初期画面

MySQLへの接続確認

事前チェック

MySQLのコンテナに入る

$ winpty docker-compose exec mysql bash

MySQLに接続

「作業ディレクトリ/.env」に設定したユーザ名(USER_NAME)、パスワード(USER_PASSWORD)を用いて接続

# mysql -uexample -pexample_password

データベースの選択

「作業ディレクトリ/.env」に設定したデータベース名(DB_NAME)を指定

mysql> use example_db;

テーブルが存在しないことを確認

mysql> show tables;
Empty set (0.00 sec)
Laravelの環境設定ファイルの編集

「作業ディレクトリ/src/」に置かれている「.env」内のデータベースに関連する設定を編集します。
DB_CONNECTIONなど下記の項目名で検索するとスムーズに見つけられると思います。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=example_db
DB_USERNAME=example
DB_PASSWORD=example_password

「作業ディレクトリ/.env」に設定した値を指定

マイグレーションの実行

こちらの手順を実行すると
「作業ディレクトリ/src/database/migrations」に配置されている(手順通りLaravelをインストールするいくつか入っているはず)内容に沿ってテーブルが作成されてしまうので、必要に応じてファイルの作り直しをしてください。

PHPのコンテナへ入る

$ winpty docker-compose exec php bash

マイグレーションの実行

# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (92.18ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (118.13ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (110.84ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (95.56ms)

Migration table created successfully.と出れば成功です。

テーブルが作成されているか確認

事前チェックと同様の手順でテーブルが確認されているか確認

mysql> show tables;
'+------------------------+
| Tables_in_example_db   |
+------------------------+
| failed_jobs            |
| migrations             |
| password_resets        |
| personal_access_tokens |
| users                  |
+------------------------+
5 rows in set (0.00 sec)

上記のようにいくつかテーブルが作成されていればOKです。


なるべく分かりやすく、簡素な構成を心掛けて環境構築手順まとめました。
参考になったら嬉しいです。
それでは良いLaravelライフをー

タイトルとURLをコピーしました