skip to content
Logo
Yurikago Blog

Laradockを利用せずにLaravelのDocker環境を構築する

/ 4 min read

Table of Contents

Laradockは便利ですが自分が必要としない機能まで含まれた状態でコンテナが作成されるためセットアップに時間がかかります。この記事ではLaravelが最低限動作するコンテナを作成します。※DBなし

検証環境

  • Docker 19.03.1
  • PHP 7.4.9
  • Laravel 6.18.35
  • Nginx 1.19.2

検証リポジトリ: https://github.com/cuavv/sandbox-laravel

コンテナ作成

PHP用、Nginx用のコンテナをそれぞれ作成します。PHPとNginxの間の通信はUNIXドメインソケットを利用します。

クライアントからのHTTPリクエストをNginxコンテナが受け取り、PHPファイルがリクエストされている場合はPHPコンテナにリクエストを転送します。PHPコンテナはPHPの処理を実行したあとレスポンスをNginxコンテナに返し、Nginxコンテナは受け取ったレスポンスをクライアントに返します。

docker-compose.yml
version: '3.3'
volumes:
php-fpm-socket:
services:
php:
image: image-php74-fpm
container_name: container-php74-fpm
build: ./infra/php
volumes:
- php-fpm-socket:/var/run/php
- ./src:/work/src
nginx:
image: image-nginx
container_name: container-nginx
build: ./infra/nginx
volumes:
- php-fpm-socket:/var/run/php
- ./src:/work/src
ports:
- 80:80

参考: https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4

PHPコンテナ

infra/php/Dockerfile
FROM php:7.4.9-fpm
# install modules required composer
RUN apt-get update && apt-get install -y zip unzip
# install php extensions
# https://github.com/mlocati/docker-php-extension-installer#copying-the-script-from-a-docker-image
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions bcmath xdebug
# install composer
COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer
# make socket directory
RUN mkdir /var/run/php
# copy config file
COPY ./php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
WORKDIR /work/src

Laravel6系が動作するためにはバージョンが7.2以上のPHPと以下のPHP拡張が必要です。

  • BCMath
  • Ctype
  • Fileinfo
  • JSON
  • Mbstring
  • OpenSSL
  • PDO
  • Tokenizer
  • XML

参考: https://laravel.com/docs/6.x/installation

今回利用するDockerイメージのphp:7 .4.9-fpmには以下のPHP拡張がプリインストールされています。

Terminal window
% docker run --rm php:7.4.9-fpm php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

参考: https://github.com/mlocati/docker-php-extension-installer#supported-php-extensions

Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XMLはすでにインストールされているので、不足しているBCMathを追加でインストールします。

php-fpmのコンフィグファイルの名称が zzz-www.conf になっている理由ですが、Dockerイメージ(php:7 .4.9-fpm)で php-fpm.d/zz-docker.conf という設定ファイルが作成されており、そちらの設定を上書きするためにアルファベット順で後ろに来る名称を付けている らしい です。

参考: https://github.com/docker-library/php/blob/master/7.4/buster/fpm/Dockerfile#L254

Nginxコンテナ

infra/nginx/Dockerfile
FROM nginx:1.19.2
# copy config file
COPY ./default.conf /etc/nginx/conf.d/default.conf
WORKDIR /work/src
"infra/nginx/default.conf
server {
listen 80;
server_name example.com;
root /work/src/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm 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 unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}

default.confの設定はLaravelのドキュメントに記載されていたものを流用しました。変更箇所はrootやfastcgi_passのみです。

参考: https://laravel.com/docs/6.x/deployment#nginx

動作確認

Terminal window
% docker-compose build
% docker-compose up -d
% docker-compose exec php bash

Laravelを /work/src 以下にダウンロードします。

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

Windowsなら http://192.168.99.100 Macなら http://localhost にブラウザでアクセスします。