前回、Laravelを別リポジトリ管理にして、かなりスッキリした。
Docker ComposeでLaravel開発環境を構築その参
でも、ふと思った、、、Laravelのプロジェクト名を変えたいな。。。
今は、Nginxのconfにベタ書きなので、.envから設定したいなーって事で、やってみた。
ついでに、色々バージョン上げよう!
マシンスペック
- Mac mini 2018
- macOS Catalina(10.15.x)
- Intel Core-i7 3.2GHz 6コア
- メモリ 32GB
- SSD 512GB
Docker環境
- Nginx 最新版
-
PHP(PHP-FPM) 7.1.x→ PHP(PHP-FPM) 7.4.x -
MySQL 5.7.x→ MySQL 8.x -
Composer 最新版→ Composer 2.x -
Laravel 5.6→ Laravel 8.x
やること
- Docker Composeで環境変数を使う
- 色々バージョンアップする
補足
各環境を行ったり来たりするので、下記のように記載します。
[Mac]$ MacのターミナルでMac内の作業
[PHP]$ MacのターミナルからPHPコンテナに接続して作業
.envファイルを作成する
環境ごとに.env作成したいので、.env.exampleを作成する。
中身は下記。
# APP名
APP_NAME=laravel
# XDebugポート
XDEBUG_PORT=9000
# DB
DATABASE_NAME=hoge
DATABASE_USER=fuga
DATABASE_PASSWORD=docker#DOCKER1234
DATABASE_ROOT_PASSWORD=docker#DOCKER1234
IDEでブレークポイント止める為の準備
IDEでブレークポイント止まらなくてハマったので、ちゃんと書いておく。
ブレークポイント止める為には、下記のポート設定が影響ある。
xdebug.remote_port = 9001
php:
〜 略 〜
- '9000:9001'
- コンテナ側のXDebugとPHP-FPM(デフォルト:9000)が同じポートだとダメらしいので、XDebugポートを9001にズラす。
- xdebug.remote_portとdocker-compose.ymlのコンテナ側ポートを同じにする。
- docker-compose.ymlのホスト側ポートとコンテナ側ポートを同じにしない。
- IDEでLISTENするポートはコンテナ側ポート(9001)。
.gitignoreの編集
- .envは除外
.env
docker-compose.ymlを編集
version: '3'
volumes:
phpsocket:
services:
nginx:
〜 略 〜
volumes:
- ./src:/home/docker
- phpsocket:/var/run
depends_on:
- php
php:
〜 略 〜
- '9000:9000'
volumes:
- ./src:/home/docker
- phpsocket:/var/run
〜 略 〜
db:
image: mysql:5.7
〜 略 〜
MYSQL_DATABASE: hoge
MYSQL_USER: fuga
MYSQL_PASSWORD: docker#DOCKER1234
MYSQL_ROOT_PASSWORD: docker#DOCKER1234
〜 略 〜
環境ファイルを各コンテナで参照したいので、下記に変更。
version: '3.8'
volumes:
phpsocket:
services:
nginx:
〜 略 〜
volumes:
- ./nginx/templates:/etc/nginx/templates
- ./src:/home/docker
- phpsocket:/var/run
depends_on:
- php
environment:
- APP_NAME=${APP_NAME}
php:
〜 略 〜
- '${XDEBUG_PORT}:9001'
volumes:
- ./src:/home/docker
- phpsocket:/var/run
〜 略 〜
db:
image: mysql:8
〜 略 〜
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD}
〜 略 〜
Nginxのconf編集
・・・
server_name laravel.local;
・・・
location / {
root /home/docker/laravel/public;
・・・
}
・・・
location ~ \.php$ {
root /home/docker/laravel/public;
・・・
}
上記に環境変数を埋め込むように修正。
・・・
server_name ${APP_NAME}.local;
・・・
location / {
root /home/docker/${APP_NAME}/public;
・・・
}
・・・
location ~ \.php$ {
root /home/docker/${APP_NAME}/public;
・・・
}
ただ、ドキュメントルートの環境変数埋め込みが、どうやってもエラーになって無理だった。
ドキュメントルートをlocationの外に出したら、環境変数を埋め込めました。
・・・
server_name ${APP_NAME}.local;
・・・
root /home/docker/${APP_NAME}/public;
location / {
・・・
}
・・・
location ~ \.php$ {
・・・
}
後述(default.confの置換)でファイル名を、conf.d/default.conf → templates/default.conf.templateにリネーム。
default.confの置換
# 設定の置換
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf
docker-compose.ymlのvolumesで解決する。
services:
nginx:
〜 略 〜
volumes:
- ./nginx/templates:/etc/nginx/templates
なので、Dockerfile内でのCOPYは不要になった
Composer2.xをインストールする修正
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
latestにしてたから最新版が入ってると思いきや、何故か 1.x だったので 2.x で固定。
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
XDebugのバージョン固定
RUN pecl install xdebug
このままだと、Xdebug 3.xがインストールされる。
Xdebug 2.x と Xdebug 3.x は、設定ファイルの記述が異なり、今までの設定だと動かない。(ハマった)
Xdebug 2.xに固定。(3.xの設定は、また今度)
RUN pecl install xdebug-2.9.8
Laravelの準備
[Mac]$ docker-compose exec --user 1000 php bash
[PHP]$ rm -fdR laravel
[PHP]$ composer create-project --prefer-dist laravel/laravel laravel "8.*"
[PHP]$ cd laravel
[PHP]$ composer require --dev barryvdh/laravel-ide-helper
[PHP]$ composer require --dev squizlabs/php_codesniffer
[PHP]$ mkdir bin
[PHP]$ vi bin/clear-laravel.sh
---
#!/bin/bash
php artisan view:clear
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache
composer dump-autoload
php artisan ide-helper:generate
php artisan ide-helper:models -N
php artisan ide-helper:meta
find . -name '._.DS_Store' -type f -ls -delete
---
:wq
[PHP]$ vi .env.example
---
:%s/DB_HOST=127.0.0.1/DB_HOST=mysql/g
:%s/DB_DATABASE=laravel/DB_DATABASE=hoge/g
:%s/DB_USERNAME=root/DB_USERNAME=fuga/g
:%s/DB_PASSWORD=/DB_PASSWORD="docker#DOCKER1234"/g
---
:wq
完成!!
https://github.com/bobtabo/docker3
※参考
docker上のnginx.confに環境変数を適用する方法
使い方
[Mac]$ cd <任意のディレクトリ>
[Mac]$ git clone https://github.com/bobtabo/docker3.git docker
[Mac]$ cd docker
[Mac]$ cp -p .env.example .env
[Mac]$ docker-compose up -d
・・・
Creating mysql ... done
Creating php ... done
Creating nginx ... done
[Mac]$ docker-compose exec --user 1000 php bash
[PHP]$ pwd
/home/docker
[PHP]$ cd laravel
[PHP]$ composer install
[PHP]$ chmod -R 777 storage
[PHP]$ chmod -R 777 bootstrap/cache
[PHP]$ cp -p .env.example .env
[PHP]$ php artisan key:generate
[PHP]$ chmod 755 bin/clear-laravel.sh
[PHP]$ bin/clear-laravel.sh
[PHP]$ php artisan migrate:fresh --seed
動作確認(Macのhosts編集)
[Mac]$ sudo vi /private/etc/hosts
★下記を点線内を追記
---
127.0.0.1 laravel.local
---
:wq
ブラウザで動作確認
コンテナ削除
[Mac]$ docker-compose down --rmi all --volumes
※参考
《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド