3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker ComposeでLaravel開発環境を構築その肆

Last updated at Posted at 2021-01-21

前回、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.xPHP(PHP-FPM) 7.4.x
  • MySQL 5.7.xMySQL 8.x
  • Composer 最新版Composer 2.x
  • Laravel 5.6Laravel 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でブレークポイント止まらなくてハマったので、ちゃんと書いておく。
ブレークポイント止める為には、下記のポート設定が影響ある。

php/xdebug.ini
xdebug.remote_port = 9001

docker-compose.yml
php:
    〜 略 〜
      - '9000:9001'
  • コンテナ側のXDebugとPHP-FPM(デフォルト:9000)が同じポートだとダメらしいので、XDebugポートを9001にズラす。
  • xdebug.remote_portとdocker-compose.ymlのコンテナ側ポートを同じにする。
  • docker-compose.ymlのホスト側ポートとコンテナ側ポートを同じにしない。
  • IDEでLISTENするポートはコンテナ側ポート(9001)。

※参考
メモ PHP docker xdebug

.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

ブラウザで動作確認

http://laravel.local/
スクリーンショット 2021-01-21 23.02.41.png

コンテナ削除

[Mac]$ docker-compose down --rmi all --volumes

※参考
《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?