DockerでLaravelの開発環境を作ってみる(1回目練習Ver)

目次

勉強のためDockerでLaravelの開発環境を作ってみました。

Laravelは使うのが初めてですし、Dockerもなれているわけではないので1回目は寄り道をしながら進めます。 最初から完全なものを作る気はなく、記録として残します。

OSは"Ubuntu 20.04.2 LTS"で行いました。

作るもの

今回作りたいものはDocker上で動作するLaravelアプリです。

フレームワークはLaravel、データベースはMySQL、webサーバーにはnginxという構成で作成します。 LaravelのインストールにはComposerが必要なのでこれもインストールします。

PHPのDockerイメージを用意する

LaravelはPHP環境で動作するwebアプリケーションフレームワークです。 まずは作業用ディレクトリwwwを作成し、DockerでPHPを使える環境を作ります。

$ mkdir www
$ cd www
~/www$ docker run -dit --name php-1st -p 8000:8000 -v "$PWD":/var/www/html php:8.0.7-fpm-buster

端末からコンテナを使えるように-ditオプションを使用します。

  • -d : デタッチモード。端末と切り離しバックグラウンドで実行します。
  • -i : インタラクティブモード。標準入出力と標準エラー出力をコンテナに連結します。
  • -t : 疑似端末(pseudo tty)を割り当てます。カーソル移動やCtrlキー等の文字入力機能が使えます。

--name php-1stコンテナに"php-1st"という名前を付けます。

-p 8000:8000公開するポートに8000を指定します。-p ホスト側ポート:コンテナ側ポート

-v "$PWD":/var/www/html現在のディレクトリをコンテナの"/var/www/html"に割り当てます。

使用するDockerイメージは「8.0.7-fpm-buster」にしました。

  • 8.0.7 : 2021年6月5日現在 新しそうなバージョンです。
  • fpm : FPM(FastCGI Process Manager) PHPのFastCGI実装で高負荷サイトで役に立つ機能があります。
  • buster : OSを表していて、Debian 10のことです。

Composerをインストールする

PHPコンテナが実行されたらComposerをインストールするためにコンテナ内に入ります。 docker execコマンドで-itオブションを指定し、シェルを実行します。 Composerのインストール手順は公式を参照しました。

https://getcomposer.org/download/

これを実行したのは2021年6月5日です。バージョンが変わるとハッシュ値が変わります。

$ docker exec -it php-1st /bin/bash
root@01187583fd24:/var/www/html# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
root@01187583fd24:/var/www/html# php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
root@01187583fd24:/var/www/html# php composer-setup.php
root@01187583fd24:/var/www/html# php -r "unlink('composer-setup.php');"

ディレクトリの内容を確認してみたら’composer.phar’ファイルがありました。これがComposerの実行ファイルのようです。

root@01187583fd24:/var/www/html# ls -l
total 2224
-rwxr-xr-x 1 root root 2270854 Jun  5 14:18 composer.phar
-rw-rw-r-- 1 1000 1000     111 Jun  5 12:01 index.html

次に、Composerをどこからでも実行できるように設定します。

PHPの本体があるディレクトリを確認します。whichコマンドで実行コマンドのフルパスを取得し、dirnameコマンドでディレクトリ部分を切り抜きます。

root@01187583fd24:/var/www/html# dirname $(which php)
/usr/local/bin

Composerの実行ファイルをPHPと同じディレクトリに拡張子無しで移動します。

root@01187583fd24:/var/www/html# mv composer.phar /usr/local/bin/composer

Composerの動作確認のため、バージョンを表示してみます。

root@01187583fd24:/var/www/html# composer --version
Composer version 2.1.1 2021-06-04 08:46:46

Laravelをインストールする

Composerを使ってLaravelをインストールします。

公式を参考に進めます。

https://laravel.com/docs/8.x

公式通りにコマンドを実行します。

root@01187583fd24:/var/www/html# composer global require laravel/installer
Changed current directory to /root/.composer
Using version ^4.2 for laravel/installer
・・・中略・・・
Package operations: 13 installs, 0 updates, 0 removals
    Failed to download symfony/polyfill-php80 from dist: The zip extension and unzip/7z commands are both missing, skipping.
The php.ini used by your command-line PHP is: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
    Now trying to download from source

Installation failed, deleting ./composer.json.

                                                            
  [RuntimeException]                                        
  git was not found in your PATH, skipping source download  
・・・中略・・・

詳細な意味は分かりませんが、unzip/7zgitが必要のようです。 apt-getコマンドでインストールします。

root@01187583fd24:/var/www/html# apt-get update
root@01187583fd24:/var/www/html# apt-get -y install unzip
root@01187583fd24:/var/www/html# apt-get -y install git

再びLaravelのインストールコマンドを実行します。

root@01187583fd24:/var/www/html# composer global require laravel/installer
Changed current directory to /root/.composer
Using version ^4.2 for laravel/installer
./composer.json has been created
Running composer update laravel/installer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 13 installs, 0 updates, 0 removals
  - Locking laravel/installer (v4.2.6)
  - Locking psr/container (1.1.1)
  - Locking symfony/console (v5.3.0)
  - Locking symfony/deprecation-contracts (v2.4.0)
  - Locking symfony/polyfill-ctype (v1.23.0)
  - Locking symfony/polyfill-intl-grapheme (v1.23.0)
  - Locking symfony/polyfill-intl-normalizer (v1.23.0)
  - Locking symfony/polyfill-mbstring (v1.23.0)
  - Locking symfony/polyfill-php73 (v1.23.0)
  - Locking symfony/polyfill-php80 (v1.23.0)
  - Locking symfony/process (v5.3.0)
  - Locking symfony/service-contracts (v2.4.0)
  - Locking symfony/string (v5.3.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 13 installs, 0 updates, 0 removals
  - Downloading symfony/polyfill-php80 (v1.23.0)
  - Downloading symfony/process (v5.3.0)
  - Downloading symfony/polyfill-mbstring (v1.23.0)
  - Downloading symfony/polyfill-intl-normalizer (v1.23.0)
  - Downloading symfony/polyfill-intl-grapheme (v1.23.0)
  - Downloading symfony/polyfill-ctype (v1.23.0)
  - Downloading symfony/string (v5.3.0)
  - Downloading psr/container (1.1.1)
  - Downloading symfony/service-contracts (v2.4.0)
  - Downloading symfony/polyfill-php73 (v1.23.0)
  - Downloading symfony/deprecation-contracts (v2.4.0)
  - Downloading symfony/console (v5.3.0)
  - Downloading laravel/installer (v4.2.6)
  - Installing symfony/polyfill-php80 (v1.23.0): Extracting archive
  - Installing symfony/process (v5.3.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.23.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
  - Installing symfony/string (v5.3.0): Extracting archive
  - Installing psr/container (1.1.1): Extracting archive
  - Installing symfony/service-contracts (v2.4.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive
  - Installing symfony/deprecation-contracts (v2.4.0): Extracting archive
  - Installing symfony/console (v5.3.0): Extracting archive
  - Installing laravel/installer (v4.2.6): Extracting archive
6 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
11 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

今度は成功したようです。

Laravel実行ファイルをシステムが見つけられるように、Composerのシステム全体のベンダーbinディレクトリを$PATHに追加します。

root@01187583fd24:/var/www/html# export PATH="$HOME/.composer/vendor/bin:$PATH"

Laravelで新規プロジェクトを作る

laravel newコマンドで"example-app"というLaravel新規プロジェクトを作り、Webブラウザで見てみることにします。

root@01187583fd24:/var/www/html# laravel new example-app

 _                               _
| |                             | |
| |     __ _ _ __ __ ___   _____| |
| |    / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V /  __/ |
|______\__,_|_|  \__,_| \_/ \___|_|

Creating a "laravel/laravel" project at "./example-app"
Installing laravel/laravel (v8.5.19)

・・・中略・・・

Application ready! Build something amazing.

“example-app"ディレクトリが作成されるので、移動しサーバーを起動します。終了するときは[Ctrl] + Cキーを使用します。

root@01187583fd24:/var/www/html# cd example-app
root@01187583fd24:/var/www/html/example-app# php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Sun Jun  6 05:58:49 2021] PHP 8.0.7 Development Server (http://127.0.0.1:8000) started

ブラウザで"http://127.0.0.1:8000"を見てみたら繋がりません。

ブラウザで接続できません

ブラウザで接続できません

調べてみたらDocker内では別のネットワークなので外からはそのIPでは接続できないそうです。Dockerはコンテナ側のポートを0.0.0.0で公開しています。

そこで、今度は--host 0.0.0.0オプションでホストのIPアドレスを指定して実行します。

root@01187583fd24:/var/www/html/example-app# php artisan serve --host 0.0.0.0
Starting Laravel development server: http://0.0.0.0:8000
[Sun Jun  6 06:43:44 2021] PHP 8.0.7 Development Server (http://0.0.0.0:8000) started

今度はブラウザで"http://127.0.0.1:8000"が表示されました。

ブラウザで接続できた

ブラウザで接続できた

Laravelが動作することは確認できたので一旦終了します。exitコマンドでDocker内のシェルを終了し、docker stopコマンドでPHPイメージを停止します。 docker ps -aコマンドで"Exited (0)“と表示されていることで、終了していることが確認できます。

root@01187583fd24:/var/www/html/example-app# exit
exit
izumi@ohishi-vm:~/www$ docker stop php-1st
php-1st
izumi@ohishi-vm:~/www$ docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED        STATUS                          PORTS     NAMES
01187583fd24   php:8.0.7-fpm-buster   "docker-php-entrypoi…"   13 hours ago   Exited (0) About a minute ago             php-1st
$

2回目へ続く。