スポンサーリンク

docker-composeでLaravel6×MySQL×Nginx環境構築

Docker
スポンサーリンク

本記事の対象の方

docker-composeで環境を構築をしたい方

最短でLaravelアプリ開発をしたい方向けに記事を書いていますのでDocker構成などをしっかり学びたい方向けではありません。
とはいえ、多少構成の説明はしたいと思いますので知りたい方だけ記事の後半を御覧いただければと思います。

ローカルで用意する環境

  • Docker 20.10
  • docker-compose 1.27.4
  • git 2.25
    ※バージョンはインストール時の最新版ですので現在の最新版とは差異があるかもしれません

Dockerとdocker-composeをインストールされていない方

Macの方

まずは下記公式サイトからDocker Desktopをインストールしてください

ターミナルを起動後、下記コマンドでDockerとdocker-composeのバージョンを確認してみましょう。確認できたらOKです。

$ docker --version
Docker version 20.10.1, build 831ebea
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

※gitについてはMacは最初から入っていると思いますが最新版にしたい場合は各自でお願いいたします。

Windowsの方

MacよりDocker環境の構築がややこしいので記事にまとめております。
下記を御覧ください。

gitについては下記コマンドでインストールできます。

$ sudo apt-get install git

docker-composeで構築する環境

  • PHP 7.4 / composer 1.10 composer 2.0.14
  • MySQL 8.0
  • nginx 1.18

※読者の方からご指摘いただいてcomposerのバージョンを上げました。

スポンサーリンク

Dockerfileリポジトリをクローン

Laravel環境を構築用のDockerfileなどをgithubにあげていますのでそれをまずはCloneします。
下記がgithubのリポジトリです。

E-handson/docker-laravel
Contribute to E-handson/docker-laravel development by creating an account on GitHub.

まずはターミナルを起動してください。
下記コマンドを実行します。

$ git clone https://github.com/E-handson/docker-laravel.git

cloneに成功したら「docker-laravel」ディレクトリが作成されます。
作成されたディレクトリに移動しましょう。下記コマンドを実行します。

$ cd docker-laravel

docker-laravel配下にはdocker-compose.ymlがあると思います。
docker-composeコマンドはdocker-compose.ymlがあるディレクトリ直下で実行できます。

Dockerサービスの立ち上げ

まずはDockerサービスを構築するために下記コマンドを実行します。

$ docker-compose build

次にDockerサービスを起動するために下記コマンドを実行します。

$ docker-compose up

サービスが立ち上がったかを確認するコマンドがありますので実行してみましょう。

$ docker-compose ps
      Name                         Command            State           Ports 
------------------------------------------------------------------------------------
docker-laravel_app_1     docker-php-entrypoint php-fpm   Up     9000/tcp 
docker-laravel_db_1      docker-entrypoint.sh mysqld     Up     3306/tcp, 33060/tcp 
docker-laravel_web_1    /docker-entrypoint.sh ngin ...   Up     0.0.0.0:8000->80/tcp

Nameがコンテナ名になります。
docker-laravel_app_1 → PHP/Composerが入っているコンテナ
docker-laravel_db_1 → MySQLが入っているコンテナ
docker-laravel_web_1 → Nginxが入っているコンテナ
Stateという列がUpになっていたらそのコンテナが起動しているということになります。

これでDockerの立ち上げは完了です。

Laravelのインストール

appコンテナにLaravelをインストール

下記コマンドを実行します。

$ docker-compose exec app composer create-project --prefer-dist "laravel/laravel=6.*" .

成功するとsrcディレクトリが作成されています。llコマンドで確認してみましょう。

$ ll
drwxrwxr-x 8 user user 4096 Dec 24 01:43 .git/
-rw-rw-r-- 1 user user 486 Dec 24 01:43 README.md
drwxrwxr-x 5 user user 4096 Dec 24 01:43 docker/
-rw-rw-r-- 1 user user 719 Dec 24 01:43 docker-compose.yml
drwxr-xr-x 3 root root 4096 Dec 24 01:46 src/

一番下のsrc配下にLaravelのソースファイルが作成されています。
では実際にブラウザで確認してみましょう。

下記URLにアクセスしてみてください。
Laravelのウェルカムページが表示されれば正常にインストールが完了しています!


http://localhost:8000/

 

MySQLの設定

./src配下にある.envを編集していきます。
76行目あたりに下記の編集前の記述があるかと思います。そこを編集後のように修正してください

編集前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

編集後

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_local
DB_USERNAME=phper
DB_PASSWORD=secret
実際に接続がうまくいっているかはマイグレーション実行で確認できます。
下記コマンドを実行します。
$ docker-compose exec app php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.11 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.08 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.04 seconds)

接続に成功しているとmigrateが実行されてMySQLに認証系などのテーブルが作成されます。
これで開発環境構築は完了です!

ちなみにdockerで構築したMySQLに外部から接続する方法を下記で紹介していますので参考にしてみてください。

Dockerコンテナで作成したMySQLに接続する方法【コンソール、MySQL Workbench、VScode】
Dockerコンテナで作成したMySQLにアクセスする方法を解説しています。コンソールでコマンド実行での接続方法、MySQL Workbenchの設定方法、VScodeでの接続方法を解説しています。一から手順を説明しています。docker-composeで作成したLaravel環境のDBコンテナを例に解説しています。ポートフォワディングの追加が必要です。
スポンサーリンク

Docker構成の説明

ここからはDocker構成の説明になります。興味のある方だけ御覧いただければと思います

リポジトリ構成

まずは今回使用したリポジトリ構成を紹介します。

docker-laravel
├── docker-compose.yml
├── docker
│    ├── mysql
│    │    ├── Dockerfile
│    │    └── my.cnf
│    ├── nginx
│    │    ├── default.conf
│    └── php
│       ├── Dockerfile
│       └── php.ini
└── src

./srcディレクトリはgit cloneした段階では存在していません。
Laravelをインストールした後に作成されます。

コンテナの構成

「docker-compose ps」で確認した通り今回は3コンテナで構成しています。

  1. appコンテナ – PHP7.4をインストールしているコンテナ
  2. dbコンテナ – MySQL8.0をインストールしているコンテナ
  3. webコンテナ – Nginx1.18をインストールしているコンテナ
appコンテナ

実際にLaravelをインストールしているのもこのコンテナです。
appコンテナの/workspace配下にインストールしたLaravelのソースはローカルのsrc/配下にマウントされています。
平たく言えば同期しているということですね。
そのため./src配下のファイルを編集すると実際にLaravelを動かしている/workspace配下のソースにも反映されるということになります。
編集する場合は./src配下を修正してももちろん良いですがおすすめはVS codeを使用してコンテナ側の/workspace配下を修正する方法です。
詳細は下記ブログに記載していますので興味がある方は御覧ください。

dbコンテナ

「MySQLの設定」の手順の際にMySQLに接続をしましたが、先ほどの接続先はこのコンテナのMySQLになります。
下記設定でユーザーとDBをbuild時に作成しています。

DB名:laravel_local
DBユーザー:phper
password:secret
webコンテナ

ローカル側のdefault.cnfに設定を記述しています。
そのファイルをコンテナ側にマウント(同期)しています。

スポンサーリンク

おまけ

docker-composeコマンドの紹介

$ docker-compose up #コンテナの起動
$ docker-compose stop #コンテナの停止
$ docker-compose restart #コンテナの停止
$ docker-compose exec app bash #appコンテナのコンソールにアクセス
$ docker-compose exec db bash #dbコンテナのコンソールにアクセス
$ docker-compose exec web ash #webコンテナのコンソールにアクセス

docker-compose exec app bashでコンソールにアクセスしてからでもLaravelコマンドは実行可能です。

$ docker-compose exec app bash
       
#コンテナのコンソールアクセス後
root@a41a0f8b0b3f:/workspace# php artisan migrate
root@ec0d92329eda:/workspace# php artisan make:model Model名

 

コメント

  1. jazmas より:

    非常に役立つ記事ありがとうございます。

    今やってみたら、autoload.phpが、この手順では、生成されなかったです。

    どうやら、 composer の推奨バージョンが変わったのが原因だったようで、
    $ docker-compose exec app composer self-update –2
    $ docker-compose exec app composer install
    として、ウェルカムページが見れました。

    • Etsu いーさん より:

      jazmasさん
      記事をご覧くださりありがとうございます。私も改めて試したところうまくいかなかったため、記事とDockerfileの修正を行いました。
      composerのバージョンを2.0.14にしたところWarningもなくなりウェルカムページまでうまくいくようになりました。
      ご指摘ありがとうございました。また何かございましたらよろしくお願いいたします。

  2. ナオナオ より:

    誤記があるので、修正ください。Djangoのインストールと書いてありますが、正しくは、「lalavelのインストール」だと思います。あとMySQLのインストールでDB_HOSTをlocal host ではなくて、dbにしたのは、なぜですか?、A5SQLなどの外部接続ツールで、接続を試してみましたが繋がりません。その上、MYSQLコマンドで、MYSQLにログインしようとしましたが、できませんでした。良い方法がありましたら、教えてください。

    DB_CONNECTION=mysql
    DB_HOST=db
    DB_PORT=3306
    DB_DATABASE=laravel_local
    DB_USERNAME=phper
    DB_PASSWORD=secret

    • Etsu いーさん より:

      ご指摘ありがとうございます。誤記修正しました。
      > DB_HOSTをlocalhost ではなくて、dbにしたのは、なぜですか?
      こちらですがLaravelをインストールしたappコンテナとMySQLをインストールしたdbコンテナ間の通信のためlocalhostではなく、コンテナ名である「db」を指定しています。
      コンテナ間の通信などで調べてみると詳細が出てくると思います。
      外部接続ツールですが私が普段利用しているMySQL WorkbenchとVScodeプラグインでの方法を記事にしたので参考にしてみてください。
      https://niwakatech.info/docker-mysql-access/
      A5SQLでも設定周りを同様に設定すれば接続できると思います。