本記事は自己学習用に作成した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よりインストーラーをダウンロードしてください。
下記画面の赤枠をクリックすることでダウンロードが始まります。
インストーラーの実行
上記手順でダウンロードした「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ファイルのリファレンスを参照してください。
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公式ドキュメントを参照
ただ、php:8.1-fpmのイメージですでにインストールされているものがあるためその辺を除外したものをインストールしています。
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の設定も公式ドキュメントに載っているのでご参照ください。
ハイライトされている行が公式ドキュメントから変更している点です。
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/
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ライフをー