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をインストールします。
公式を参考に進めます。
公式通りにコマンドを実行します。
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/7z
とgit
が必要のようです。
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
$