DockerでLaravel8の開発環境を構築する

Table of Contents

Table of Contents

この記事では、Dockerを使って自分のコンピュータにLaravel8の開発環境を構築する方法を説明します。

docker installation

https://docs.docker.com/get-docker/

ローカル環境

$ docker --version
Docker version 20.10.2, build 2291f61

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

ソースコード

https://github.com/scobin/docker-php

docker-compose.ymlの説明

docker-compose.ymlはコンテナを構築、管理する設定ファイルです。
今回は4つのコンテナを作成します。 それらは、nginxphpdbphpmyadminです。

nginx と phpmyadmin は、提供されたイメージファイルを直接使用します。
php、dbはカスタマイズする必要があるので、Dockerfileを使ってカスタマイズします。

php用のDockerfileは/phpフォルダにあるので、中身を見てみましょう。今回はPHP8の環境を作り、composerもインストールしています。

dbのdockerfileは/mysqlフォルダの下にあり、今回はmysql8を使用しています。

コンテナ内のファイルとリンクする

コンテナ内のファイルを操作したい場合、一般的にはコンテナ内に入ってコマンドを実行するのができますが、一つの手間が増えて少し不便を感じることがあります。もし、コンテナ外のファイルと連携して、コンテナに入らなくても修正や閲覧ができたらいいですね。

そのために、docker-compose.ymlvolumnsという記述を利用することでそのようなことができます。例えば、下記のようにvolumnsの記述を入れると、プロジェクトの/serverパスをphpコンテナ内の/var/www/パスに連結することになります。

ですので、後でプロジェクトの/server配下にLaravelアプリケーションを作成すると、コンテナ内の/var/www/にもLaravelアプリケーションを作成されます。/serverの下のコンテンツを修正すると、コンテナ内の/var/www/のコンテンツを修正するのと同じことになります。

php:
    container_name: php-laravel
    build: ./php
    volumes:
      - ./server:/var/www/:delegated

phpコンテナだけでなく、nginxコンテナにも関連する設定がありますので、そちらも参考にしてください。

Nginxのルートディレクトリへのパスを注意してください。

nginx.confのルート設定で、example-appは、後でビルドするLaravelアプリケーションのプロジェクト名です。自分で修正することもできますが、後でLaravelアプリケーションをビルドする際には、必ず同じ名前を使用してください。


...
root /var/www/example-app/public;
index index.php index.html;
...

Docker環境の起動&関連コマンド

コンテナの作成と起動

以下のコマンドを使用してコンテナを作成・起動すると、最初の実行には時間がかかります。

docker-compose up -d --build

コンテナのクローズと削除

コンテナを閉じたり削除したりするには、以下のコマンドを使います。

docker-compose down

コンテナを削除したくない場合は、以下のコマンドを使用します。

docker-compose stop

Laravelのインストール

次に、php-laravelコンテナに入り、Laravelをインストールします。

コンテナへのアクセス

下記のコマンドでコンテナに入ります。(php-laravelはコンテナ名です。)

docker exec -it php-laravel bash

コンテナの作成と起動に成功したら、php-laravelコンテナに入って、PHP、composerのバージョンが正しいかどうかを確認します。
なお、この時点ではまだLaravelアプリケーションは作成されていませんので、var/wwwにアクセスしてLaravelアプリケーションを作成する必要があります。
ここでは、composerを使って、example-appという名前でLaravelのアプリケーションを構築する方法を紹介します。

もしexample-appではなく、ほかの名前を使うならnginx.confのディレクトリ設定も変更してください。

# change path according to your nginx.conf
cd ..
# create project
composer create-project laravel/laravel example-app

アプリケーションの作成にも時間がかかりますので、しばらくお待ちください。 この時間を利用して、ブラウザでlocalhost:8811を開き、phpmyadminのページが正しく表示されているかどうかを確認することができます。

アプリケーションのビルドが完了したら、exitコマンドでコンテナから退出し、以下のコマンドでコンテナを再起動します。

docker-compose restart

再びブラウザでlocalhost:8010を開き、Laravelのデフォルトページが正しく表示されているか確認してください。
正常に表示されれば、設定が正しいことになります。

権限エラー:Permission Denied

もし以下のようなメッセージが出てきましたら、権限の設定変更を行ってください。

UnexpectedValueExceptionThe stream or file “/var/www/example-app/storage/logs/laravel.log” could not be opened in append mode: Failed to open stream: Permission denied

フォルダの権限設定があっていないため、相応しい変更が必要です。
まずはphp-fpmのユーザー名を確認します。
php-fpmconfigファイルに設定情報があるため、PHPコンテイナーに入って、 usr/local/etc/php-fpm.d/www.confにはこのような設定を確認できます。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
;       will be used.
user = www-data
group = www-data

ユーザーとグループはwww-dataになっていますので、storagebootstrap/cacheの所有者とグループをwwww-dataに変更しましょう。

# Enter php container.
docker-compose exec php bash
# Change owner/group and permission.
chown -R www-data:www-data /var/www/example-app/storage
chown -R www-data:www-data /var/www/example-app/bootstrap/cache
chmod -R 775 /var/www/example-app/storage
chmod -R 775 /var/www/example-app/bootstrap/cache

以上は今回の構築手順です。
おめでとうございます!PHP8、MySQL8、Laravel8のDocker環境の構築に成功しました。