これまでに本ブログではLaravelの開発環境を構築するするためにLaravelから提供されているHomesteadやValetでの構築方法について説明を行ってきました。今回は、macOS上でDockerを使いLaravel開発環境の構築を行います。LaravelではDockerを使ってLaravel環境を構築するためのツールLaradockがあります。

Laradockを利用することでDocker上にLaravelの開発環境を構築することができます。

Laradockを利用するためにはDockerとgitが必要になります。gitはデフォルトではmacOSにインストールされていないのでインストールを行なっておく必要がありますがHomebrewの途中で行われるXcode Command Line Toolsのインストールに含まれています。またはgitコマンドを初めて実行するとXcode Command Line Toolsのインストールを行うか確認されます。Homebrewでもインストール可能です。
fukidashi

Dockerのインストール

Homebrewによるインストール

Laradockを利用するためにはmacOSにDockerをインストールする必要があります。DockerのインストールにHomebrewを利用して行います。

Homebrewはmac OS上で動作するパッケージマネージャーでソフトウェアのインストール、アンインストールをコマンドラインを使って行うことができる便利なツールです。
fukidashi

brew caskコマンドを実行してdockerのインストールを行います。


$ brew cask install docker

brewコマンドでdockerをインストールしただけではdockerを操作するためのコマンドdocker、docker-composeを利用することができませんがアプリケーションフォルダからDockerのアプリケーションを起動するとコマンドが使えるようになります。

Dockerアプリケーションの起動

画面上にあるメニューから移動→アプリケーションに移動してDockerのアプリケーションが保存されていることを確認します。Dockerのアイコンを確認したらダブルクリックしてください。

Dockerアプリケーション
Dockerアプリケーション

ダブルクリックするとアプリケーションを開くかどうかの確認画面が表示されます。開くボタンをクリックしてください。

Dockerアプリ開くの確認
Dockerアプリ開くの確認

Dockerデスクトップはアクセス権限が必要となるのでパスワードが必要となります。そのままOKボタンを押してください。

Dockerアクセス権限
Dockerアクセス権限

パスワードを聞かれるのでmacOSのログインユーザ名とパスワードを入力してください。

パスワードの入力
パスワードの入力

Dockerデスクトップの起動が開始します。

Dockerデスクトップの起動
Dockerデスクトップの起動

しばらくするとDeckerデスクトップの起動が完了します。

Dockerデスクトップ起動完了
Dockerデスクトップ起動完了

起動が完了したらコマンドラインでdockerのバージョンを確認しましょう。


% docker version
Docker version 19.03.5, build 633a0ea
% docker-compose version
docker-compose version 1.25.2, build 698e2846

Dockerのインストールは完了です。

Laradockの設定

LaradockのインストールやLaravelのインストールについてはLaradockのドキュメントを参考に行なっています。

任意の場所にLaradock用のフォルダを作成します。ここではデスクトップ上にlaradock_testフォルダを作成しています。これからの作業でこのフォルダの配下にLaradockとLaravelに関連するファイルが保存されることになります。


% mkdir laradock_test
% cd laradock_test 

git cloneコマンドを実行して、Laradockリポジトリから複製を行います。


% git clone https://github.com/LaraDock/laradock.git

実行後、laradock_testフォルダにはlaradockフォルダが作成されることを確認しlaradockフォルダに移動します。コンテナの作成に必要なdocker-compose.ymlや作成するコンテナに関連する変数が設定されているenv-exampleファイルがあります。

docker-compose.ymlファイルにはDockerのコンテナに関する情報が記述されています。Laravelを開発する際に必要となるMySQLやNginxの情報も記述されており、各アプリケーションのバージョンも指定できます。
fukidashi

% cd laradock

.envファイルの作成

env-exampleファイルを複製して.envファイルを作成します。


% cp env-example .env

コンテナの起動

今回はngix, mysql, workspaceのコンテナを作成します。docker-composerコマンドを利用しますが、初回実行時はコンテナの作成を行うため時間がかかります。一度実行すれば次回からはすぐに起動することができます。


% docker-compose up -d nginx mysql workspace
docker-composeにngix, mysql, workspaceを指定していますが個別に実行することも可能です。先にnginxとworkpaceのコンテナを作成して、後ほどmysqlのコンテナの作成もできます。
fukidashi

docker-composeコマンドの実行が完了したら、ブラウザでlocalhostにアクセスしてみましょう。

Nginx Not Foundエラー
Nginx Not Foundエラー

Not Foundエラーが表示されますが、nginxが起動していることがわかります。

コンテナな状態を確認するためにdocker-compose psコマンドを実行します。StateがUpになっていることが確認できます。StateがUpは起動していることを表しています。


% docker-compose ps
           Name                          Command              State                    Ports                  
--------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp, 2376/tcp                      
laradock_mysql_1              docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp, 33060/tcp       
laradock_nginx_1              /bin/bash /opt/startup.sh       Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp                                
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp

Laravelのインストール

コンテナが起動していることが確認できたのでworkspaceへ接続を行い、Laravelのインストールを行います。

workspaceへの接続は下記のコマンドで実行します。接続が完了するとコンテナ上でのパスは/var/wwwとなります。


% docker-compose workspace bash
root@886fd916bf54:/var/www# 

composerコマンドでLaravelのインストールを行います。

composerはインストール済です。
fukidashi

ここではインストールディレクトリをlaravel6としています。任意の名前をつけてください。


# composer create-project --prefer-dist laravel/laravel laravel6

インストールが完了したら、macOS側からブラウザでアクセスしLaravelの初期画面が表示されるか確認を行います。

しかし、先ほどと同様にNot Foundが表示されます。先ほど任意につけたlaravel6のパスをmacOS側のlaradockフォルダの下にある.envファイルに追加する必要があります。

Nginx Not Foundエラー
Nginx Not Foundエラー
LaradockではデフォルトではmacOSのlaradockフォルダの親フォルダにLaravelのアプリケーションが存在すると想定して設定されているためです。
fukidashi

root@886fd916bf54:/var/www# exit
exit

コンテナからログアウトする場合はexitコマンドを実行してください。

masOS側のlaradockフォルダに保存されている.envファイルを開いてAPP_CODE_PATH_HOSTパラメータの値を変更します。下記のフォルダ名はlaravelインストール時に指定した名前なので環境によって異なります。


APP_CODE_PATH_HOST=../laravel6/

一度コンテナを停止して、再度起動を行います。


 % docker-compose stop
Stopping laradock_nginx_1            ... done
Stopping laradock_php-fpm_1          ... done
Stopping laradock_workspace_1        ... done
Stopping laradock_docker-in-docker_1 ... done
Stopping laradock_mysql_1            ... done
 % docker-compose up -d nginx mysql workspace
Starting laradock_docker-in-docker_1 ... done
Starting laradock_mysql_1            ... done
Starting laradock_workspace_1        ... done
Starting laradock_php-fpm_1          ... done
Starting laradock_nginx_1            ... done

再度ブラウザでアクセスを行い、Laravelの初期画面が表示されたらLaradockでのLaravelのインストールは完了です。

Laravelの初期画面
Laravelの初期画面

MySQLへの接続

次はMySQLに接続を行い、テーブルが作成できるか確認を行います。

Laradockでは.envファイルでMYSQL_VERSIONを設定しない場合は最新のバージョンであるMySQL 8がインストールされます。

バージョンはdocker-composeでmysqlに接続した際に表示されています。下記のように8.0.19であることが確認できます。


 % docker-compose exec mysql mysql -udefault -psecret
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.19 MySQL Community Server - GPL

MySQLのユーザはdefaultとrootが初期設定されておりパスワードはsecretとrootです。データベース名はdefaultに設定されています。

LaravelからMySQLに接続するためにはLaravelのインストールディレクトリにある.envを更新して接続情報を変更する必要があります。

.envはlaradockにあるDockerで利用するものとlaravelのインストールディレクトリ下にある.envがあるので混乱しないように注意してください。
fukidashi

.envファイルのデータベースの接続に関する環境変数を以下のように書き換えます。


DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

テーブルの作成

.envの更新が終わったら、php artisan migrateコマンドを実行します。


 % php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = default and table_name = migrations and table_type = 'BASE TABLE')
MySQLのバージョンが5.7の場合はこのエラーは発生しません。
fukidashi

パスワード検証プラグインを変更する

これはMySQLのバージョンが8となりパスワード検証プラグインがcaching_sha2_passwordに設定されており、PHPのデータベース接続用のPDOドライバが未対応のためです。パスワード検証プラグインを以前の方法に戻せばエラーは解消します。

MySQLのコンテナにrootユーザで接続します。defaultユーザでは権限の関係で変更することができません。


  % docker-compose exec mysql mysql -uroot -proot

MySQL上で以下のコマンドを実行するとplugin列がすべてcaching_sha2_passwordになっていることが確認できます。


mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | caching_sha2_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

defaultユーザのpluginをalter userコマンドを使ってmysql_native_passwordに変更します。変更後、defaultユーザのpluginがmysql_native_passwordに変更されていることが確認できます。


mysql> alter user 'default'@'%' identified with mysql_native_password by 'secret';
mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | mysql_native_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

再度php artisan migrateコマンドを実行するとテーブルが作成されることが確認できます。


root@886fd916bf54:/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.04 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.03 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)

MySQLへの接続ができればDocker上のLaravelでアプリケーションの開発を開始することができます。

Dockerのコマンド

laradockを利用する上で必要となるdockerコマンドのみ記述しています。

docker-composeコマンドはdocker-compose.ymlのあるフォルダで実行してください。本環境ではlaradockフォルダ内です。

もし異なるフォルダで実行すると以下のエラーが発生します。


 % docker-compose ps
ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

docker-composerコマンドとは異なりdockerコマンドはどこでも実行できます。

コンテナの起動

docker-compose up -d {コンテナ名}でコンテナを起動することができます。コンテナ名は以下のように複数指定することもできます。一つずつ指定して個別に起動することもできます。


% docker-compose up -d nginx mysql workspace

コンテナの停止

docker-compose stopコマンドで起動しているコンテナをすべて停止することができます。


 % docker-compose stop

特定のコンテナだけを停止したい場合は以下のようにstopのあとにコンテナの名前を指定します。


 % docker-compose stop mysql

コンテナの起動確認

docker-compose psコマンドでコンテナの一覧を表示させることができます。どのコンテナが起動しているかもstatus列で確認できます。


% docker-compose ps
           Name                          Command               State                   Ports              
----------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up         2375/tcp, 2376/tcp               
laradock_mysql_1              docker-entrypoint.sh mysqld     Up         0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1              /bin/bash /opt/startup.sh       Exit 137                                    
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Exit 0                                      
laradock_workspace_1          /sbin/my_init                   Up         0.0.0.0:2222->22/tcp  

docker-compose ps -aコマンドでもコンテナの一覧を表示することができます。

docker psコマンドでは起動しているコンテナのみ一覧表示されるので停止している場合はdocker psコマンドでは何も表示されません。停止している場合はdocker ps -aコマンドでコンテナの一覧が表示されます。
fukidashi

workspaceへの接続

workspaceへの接続は以下のコマンドで行います。


% docker-compose exec workspace bash 
root@886fd916bf54:/var/www# 

ログアウトした場合はexitコマンドを実行してください。

mysqlへの接続

mysqlへの接続は以下のコマンドで行うことができます。


 % docker-compose exec mysql mysql -udefault -psecret
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

[commet]mysqlのデフォルトのパスワードはlaradockフォルダの.envファイルに記述されており、ユーザ名はdefaultでパスワードはsecretです。データベース名はdefaultです。[/comment]

コンテナの削除

作成したコンテナは以下のコマンドで削除することができます。削除後にdocker-compose psコマンドを実行しても何もコンテナの情報は表示されません。


% docker-compose down
Removing laradock_nginx_1            ... done
Removing laradock_php-fpm_1          ... done
Removing laradock_workspace_1        ... done
Removing laradock_docker-in-docker_1 ... done
Removing laradock_mysql_1            ... done
Removing network laradock_frontend
Removing network laradock_backend
Removing network laradock_default
% docker-compose ps  
Name   Command   State   Ports
------------------------------

Dockerのアンインストール

インストールしたdockerをアンインストールする場合もHomebrewを利用します。

Homebrewでインストールしたdockerは下記のコマンドで確認することができます。


 % brew cask list
docker

dockerがインストールされていることが確認できるので、uninstallコマンドを利用して削除を行います。


% brew cask uninstall docker

削除する際にdockerコマンドも合わせて削除されます。削除後はdockerコマンドを実行すると以下のようにエラーが表示されます。


 % docker
zsh: command not found: docker