🌱
Laravelの開発環境をDockerで構築する
開発環境
- macOS
- VSCode
- Laravel
- PHP
- MySQL
- NGINX
行いたいこと
- Laravelの開発環境をDockerで構築したのでその流れを記載します
Laravelの開発環境をDockerで構築する手順
・Laravel開発環境を構築していくディレクトリの作成をしファイルに移動する
ターミナル
$ mkdir Laravel_app # ディレクトリの作成
$ cd Laravel_app # ディレクトリへ移動
※ 作成したLaravel_app
ディレクトリの配下に以下のようなディレクトリとファイルを作成する
・Laravel_app
ディレクトリの配下にdocker
ディレクトリを作成する
ターミナル
$ mkdir docker # ディレクトリの作成
$ cd docker # ディレクトリへ移動
・docker
ディレクトリの配下にnginx
というディレクトリを作成する
ターミナル
$ mkdir nginx # ディレクトリの作成
$ cd nginx # ディレクトリへ移動
・nginx
ディレクトリの配下にdefault.conf
を作成する(nginxの設定
をするファイル)
ターミナル
$ touch default.conf # ファイルの作成
・作成されたdefault.conf
ファイルにコードを記載する
default.conf
server {
listen 80;
root /var/www/laravel-app/public;
index index.php;
location / {
root /var/www/laravel-app/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;
}
}
コードの解説
default.conf
server { # サーバーブロック開始
listen 80; # HTTPリクエストのポート80番で待機
root /var/www/laravel-app/public; # ドキュメントルートをLaravel-appのpublicディレクトリに設定
index index.php; # デフォルトのインデックスファイルをindex.phpに設定
location / { # ルートパス(/)へのリクエスト処理
root /var/www/laravel-app/public; # ルートパスでもpublicディレクトリを参照
index index.php; # index.phpを優先的に探す
try_files $uri $uri/ /index.php$query_string; # リクエストされたファイルが存在すればそのまま返し、なければindex.phpにリダイレクト
}
location ~ .php$ { # PHPファイルへのリクエスト処理
try_files $uri =404; # PHPファイルが存在しなければ404エラーを返す
fastcgi_split_path_info ^(.+.php)(/.+)$; # PHPファイルのパスを分割
fastcgi_pass app:9000; # PHP-FPMにリクエストを転送(コンテナ名 app を指定)
fastcgi_index index.php; # インデックスファイルをindex.phpに設定
include fastcgi_params; # FastCGIリクエストの基本パラメータをインクルード
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # PHPスクリプトのフルパスを設定
fastcgi_param PATH_INFO $fastcgi_path_info; # PATH_INFOをPHPに渡す
}
}
・docker
ディレクトリの配下にphp
というディレクトリを作成する
ターミナル
$ mkdir php # ディレクトリの作成
$ cd php # ディレクトリへ移動
・php
ディレクトリの配下にDockerfile
を作成する(Dockerコンテナ
の起動に使うファイル)
ターミナル
$ touch Dockerfile # ファイルの作成
・作成されたDockerfile
にコードを記載する
Dockerfile
FROM php:8.2-fpm
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
&& docker-php-ext-install zip pdo_mysql
#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
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"
コードの解説
Dockerfile
# 使用するPHPのバージョンを指定。8.2-fpmはPHPのFastCGI Process Manager版を使用。
FROM php:8.2-fpm
# カスタムのphp.iniをコンテナ内にコピー
COPY php.ini /usr/local/etc/php/
# パッケージリストを更新し、必要なライブラリをインストール
RUN apt-get update \
&& apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
&& docker-php-ext-install zip pdo_mysql
# Composerをインストールするコマンド
# Composerのインストーラーをダウンロード
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# ダウンロードしたインストーラーを実行
RUN php composer-setup.php
# インストーラーを削除してきれいにする
RUN php -r "unlink('composer-setup.php');"
# composer.pharをシステム全体で使用できるように /usr/local/bin/composer に移動
RUN mv composer.phar /usr/local/bin/composer
# Composerの動作に関する環境変数を設定
ENV COMPOSER_ALLOW_SUPERUSER 1
# Composerのホームディレクトリを設定
ENV COMPOSER_HOME /composer
# コンテナ内でComposerの実行パスを追加
ENV PATH $PATH:/composer/vendor/bin
# 作業ディレクトリを指定 (コンテナ内での作業場所)
WORKDIR /var/www
# Laravelインストーラーをグローバルにインストール
RUN composer global require "laravel/installer"
・php
ディレクトリの配下にphp.ini
ファイルを作成する(PHPの設定
をするファイル)
ターミナル
$ touch php.ini # ファイルの作成
・作成されたphp.ini
ファイルにコードを記載する
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[opcache]
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.ini
[Date]
date.timezone = "Asia/Tokyo" # PHPのデフォルトタイムゾーンを「Asia/Tokyo」に設定
[mbstring]
mbstring.internal_encoding = "UTF-8" # mbstringの内部エンコーディングをUTF-8に設定
mbstring.language = "Japanese" # mbstringの使用する言語を日本語に設定
[opcache]
opcache.memory_consumption = 128 # OPCacheのメモリ消費量を128MBに設定
opcache.interned_strings_buffer = 8 # OPCacheの内部文字列バッファサイズを8MBに設定
opcache.max_accelerated_files = 4000 # 最大のアクセラレートファイル数を4000に設定
opcache.revalidate_freq = 60 # ファイル変更の再確認頻度を60秒に設定
opcache.fast_shutdown = 1 # OPCacheのシャットダウン時に最適化を行う設定
opcache.enable_cli = 1 # CLIでもOPCacheを有効にする
・Laravel_app
ディレクトリの配下にcompose.yml
ファイルを作成する
ターミナル
$ touch compose.yml # ファイルの作成
・作成されたcompose.yml
ファイルにコードを記載する
compose.yml
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
コードの解説
compose.yml
services: # 複数のサービス(コンテナ)を定義するセクション
app: # PHPアプリケーションを実行するサービス
container_name: app # コンテナ名を "app" に指定
build: ./docker/php # ./docker/php ディレクトリにある Dockerfile を使ってイメージをビルド
volumes: # ホストとコンテナ間で共有するフォルダを指定
- .:/var/www # ホストの現在のディレクトリをコンテナ内の /var/www にマウント
nginx: # Nginx(Webサーバー)を実行するサービス
image: nginx # DockerHub から公式の Nginx イメージを利用
container_name: nginx # コンテナ名を "nginx" に指定
ports: # ポートのマッピングを設定
- 8000:80 # ホストの8000番ポートをコンテナの80番ポートにマッピング
volumes: # ホストとコンテナ間で共有するフォルダを指定
- .:/var/www # ホストの現在のディレクトリをコンテナ内の /var/www にマウント
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx の設定ファイルをコンテナ内にマウント
working_dir: /var/www # コンテナ内での作業ディレクトリを /var/www に設定
depends_on: # このサービスが依存する他のサービスを指定
- app # "app" サービスが起動した後にこのサービスを起動
db: # データベース(MySQL)を実行するサービス
image: mysql:5.7 # DockerHub から MySQL 5.7 のイメージを利用
container_name: db # コンテナ名を "db" に指定
environment: # 環境変数を指定(MySQLの初期設定用)
MYSQL_ROOT_PASSWORD: root # MySQL の 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
# MySQLの起動時に文字セットと照合順序を指定
volumes: # ホストとコンテナ間で共有するフォルダを指定
- ./docker/db/data:/var/lib/mysql # データベースのデータをホストに永続化
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf # MySQL の設定ファイルをコンテナ内にマウント
- ./docker/db/sql:/docker-entrypoint-initdb.d # 初期化用SQLファイルを配置
ports: # ポートのマッピングを設定
- 3306:3306 # ホストの3306番ポートをコンテナの3306番ポートにマッピング
Dockerコンテナの起動
・作成したcompose.yml
ファイルを使いDockerコンテナ
を起動します
フォアグラウンドでDockerコンテナを起動する場合(リアルタイムでログの表示)
・新しいターミナルを開いて以下のコマンド(ログがターミナルにリアルタイムで表示される)
ターミナル
$ docker compose up # フォアグラウンドでDockerの起動
・コンテナの停止
コンテナ起動中のターミナルでCtrl + C
(Mac / Linux)
バックグラウンドでDockerコンテナを起動する場合
・既存のターミナルで以下のコマンド
ターミナル
$ docker compose up -d # バックグラウンドでDockerの起動
・コンテナの停止と再開
ターミナル
$ docker compose stop # Dockerコンテナを停止
$ docker compose start # Dockerコンテナを再開
Dockerコンテナが正常に起動しているかの確認
$ docker compose ps
※ この時点ではまだhttp://localhost:8000/
に繋いでも404 Not Found
のエラーが出ている
Laravelのアプリケーションを作成する
・Dockerコンテナ起動後、以下のコマンドでコンテナの中に入る
$ docker compose exec app bash
・Laravelのアプリケーションを作成するコマンド
$ composer create-project --prefer-dist laravel/laravel laravel-app "10.*"
lsコマンドでLaravelのアプリケーションが作成されたことを確認
$ ls
・出力例
macbook@MacBook-Air laravel-app % ls
README.md bootstrap config phpunit.xml routes vendor
app composer.json database public storage vite.config.js
artisan composer.lock package.json resources tests
※ 正しくできていればhttp://localhost:8000/
で以下のように表示されます。
以上でDockerによるLaravelの開発環境の構築は終了です。
Discussion