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コンテナは受け取ったレスポンスをクライアントに返します。
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コンテナ
FROM php:7.4.9-fpm
# install modules required composerRUN 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-imageCOPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/RUN install-php-extensions bcmath xdebug
# install composerCOPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer
# make socket directoryRUN mkdir /var/run/php
# copy config fileCOPY ./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拡張がプリインストールされています。
% docker run --rm php:7.4.9-fpm php -m[PHP Modules]CorectypecurldatedomfileinfofilterftphashiconvjsonlibxmlmbstringmysqlndopensslpcrePDOpdo_sqlitePharposixreadlineReflectionsessionSimpleXMLsodiumSPLsqlite3standardtokenizerxmlxmlreaderxmlwriterzlib
参考: 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コンテナ
FROM nginx:1.19.2
# copy config fileCOPY ./default.conf /etc/nginx/conf.d/default.conf
WORKDIR /work/src
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
動作確認
% docker-compose build% docker-compose up -d% docker-compose exec php bash
Laravelを /work/src
以下にダウンロードします。
% composer create-project --prefer-dist laravel/laravel ./ "6.*"
Windowsなら http://192.168.99.100 Macなら http://localhost にブラウザでアクセスします。