技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Laravel 開発環境をDockerで

久々にPHP 使うお仕事になったついで。
PHP で非常に人気のある Laravel の開発環境を用意したいと思った。(※注意:リリース環境ではありません)

XAMPP とかクソくらえ!

ちょっと暴論ではあるのだけど、自分は XMPP が気に入らない。

理由は非常に明白で

  • 常駐アプリ入れすぎ
  • 何でもかんでも入りすぎ
  • しかも重い

という事で、既存の環境を汚さずに開発環境を手に入れるのが自分の中でジャスティス。
そこで、Docker でその対応を行ってみようという企画です。

Laravel のインストール方法を見てみる

ちょっと調べてみると、Homestead や LaravelValet とかいうものがあるらしい。
で、LaravelValet は Windows ではつけあないとかなんとか…

www.hypertextcandy.com

Docker で構築する以上どうでもいい気がする…。
で、更に調べると、Composer で構築するっぽいことがわかった

github.com

ここまで判ればまずは手を動かしてみるか

ごめん、公式見た方がかなりマシ

laravel.com

composer だとコマンド一発だわ。
長時間無駄した…

PHP と Composer インストール済み環境を作る

といっても、Docker 系ファイル作成するだけ

基本的な Docker イメージは Docker Hub ここから取ってくる。
ちょうど、PHPComposer があるので、これで環境作っちゃえ

docker-compose.yml

version: '2'
services:
  host:
    restart: always
    build: ./data/main
    environment: 
      TZ: 'Asia/Tokyo'
    volumes:
      - './sources:/root/codes'

volumes 設定で、ローカルディスク(./sources)を仮想 OS 上のディレクトリ、 /root/codes に紐づける

で、./data/main/Dockerfile はこんな感じ

FROM php:7-fpm-buster
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y unzip curl wget git gcc
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /root
  • php7-fpm-buster というタグ(設定のバージョン)をベースにする。(これ自体は debian ベース)
  • とりあえず apt-get で必要そうなソフトを入れておく
  • composer の Docker イメージから、/usr/bin/composer だけつまみ食い的に取ってくる
  • ログイン時の作業ディレクトリを /root 指定

てな感じ。

では早速ビルド

PS C:\Workspace\PHP\lalabel> docker-compose build
Building host
Step 1/4 : FROM php:7-fpm-buster
 ---> f5460fa2369d
Step 2/4 : RUN apt-get update &&     apt-get upgrade -y
 ---> Running in a714759d79bb
Get:1 http://deb.debian.org/debian buster InRelease [121 kB]
Get:2 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:3 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:4 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]
Get:5 http://security.debian.org/debian-security buster/updates/main amd64 Packages [260 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [7860 B]
Fetched 8414 kB in 1s (6516 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following package was automatically installed and is no longer required:
  lsb-base
Use 'apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Removing intermediate container a714759d79bb
 ---> bc4b7370dc31
Step 3/4 : COPY --from=composer /usr/bin/composer /usr/bin/composer
latest: Pulling from library/composer
801bfaa63ef2: Already exists
30e209609427: Pull complete
320f26ee9b1c: Pull complete
4612e05a72cf: Pull complete
9b2beae78beb: Pull complete
79c03e12047a: Pull complete
51393fef6543: Pull complete
5571c1cd7f43: Pull complete
65564f077fec: Pull complete
d65380960587: Pull complete
925a16b14f98: Pull complete
b5b77b9b221e: Pull complete
5f53c0c9d3ed: Pull complete
555ce7422600: Pull complete
312d42e4a2ef: Pull complete
Digest: sha256:dd50f470e49d0b3ab9efe556dec5a8485703629ba7128e0f56c196d166f734f0
Status: Downloaded newer image for composer:latest
 ---> 8a9435afb5dd
Step 4/4 : WORKDIR /var/www/html
 ---> Running in 466504abae53
Removing intermediate container 466504abae53
 ---> 764db2ea70ec

Successfully built 764db2ea70ec
Successfully tagged lalabel_host:latest

では起動

PS C:\Workspace\PHP\lalabel> docker-compose up -d
Creating lalabel_host_1 ... donedoc
PS C:\Workspace\PHP\laravel> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS      NAMES
bda1c00994e0   laravel_host   "docker-php-entrypoi…"   14 seconds ago   Up 13 seconds   9000/tcp   laravel_host_1
PS C:\Workspace\PHP\laravel> 

ではログインしてプロジェクト立ち上げますか

root@2743ff93f2f3:~/codes# composer create-project laravel/laravel example-app
Creating a "laravel/laravel" project at "./example-app"
Installing laravel/laravel (v8.5.7)
  - Downloading laravel/laravel (v8.5.7)
  - Installing laravel/laravel (v8.5.7): Extracting archive
Created project in /root/codes/example-app
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals
  - Locking asm89/stack-cors (v2.0.2)
  - Locking brick/math (0.9.1)
  - Locking dnoegel/php-xdg-base-dir (v0.1.1)
  - Locking doctrine/inflector (2.0.3)
  - Locking doctrine/instantiator (1.4.0)
  - Locking doctrine/lexer (1.2.1)

...中略...

  - Installing phar-io/version (3.0.4): Extracting archive
  - Installing phar-io/manifest (2.0.1): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (9.5.0): Extracting archive
77 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
73 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

するとローカルディレクトリは f:id:white-azalea:20210113094637p:plain

よっしこれで開発が始められる…