Dockerを使ったLaravel環境構築(Laradock)
これまでに本ブログではLaravelの開発環境を構築するするためにLaravelから提供されているHomesteadやValetでの構築方法について説明を行ってきました。今回は、macOS上でDockerを使いLaravel開発環境の構築を行います。LaravelではDockerを使ってLaravel環境を構築するためのツールLaradockがあります。
Laradockを利用することでDocker上にLaravelの開発環境を構築することができます。
目次
Dockerのインストール
Homebrewによるインストール
Laradockを利用するためにはmacOSにDockerをインストールする必要があります。DockerのインストールにHomebrewを利用して行います。
brew caskコマンドを実行してdockerのインストールを行います。
$ brew cask install docker
brewコマンドでdockerをインストールしただけではdockerを操作するためのコマンドdocker、docker-composeを利用することができませんがアプリケーションフォルダからDockerのアプリケーションを起動するとコマンドが使えるようになります。
Dockerアプリケーションの起動
画面上にあるメニューから移動→アプリケーションに移動してDockerのアプリケーションが保存されていることを確認します。Dockerのアイコンを確認したらダブルクリックしてください。
ダブルクリックするとアプリケーションを開くかどうかの確認画面が表示されます。開くボタンをクリックしてください。
Dockerデスクトップはアクセス権限が必要となるのでパスワードが必要となります。そのままOKボタンを押してください。
パスワードを聞かれるのでmacOSのログインユーザ名とパスワードを入力してください。
Dockerデスクトップの起動が開始します。
しばらくするとDeckerデスクトップの起動が完了します。
起動が完了したらコマンドラインで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ファイルがあります。
% cd laradock
.envファイルの作成
env-exampleファイルを複製して.envファイルを作成します。
% cp env-example .env
コンテナの起動
今回はngix, mysql, workspaceのコンテナを作成します。docker-composerコマンドを利用しますが、初回実行時はコンテナの作成を行うため時間がかかります。一度実行すれば次回からはすぐに起動することができます。
% docker-compose up -d nginx mysql workspace
docker-composeコマンドの実行が完了したら、ブラウザでlocalhostにアクセスしてみましょう。
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のインストールを行います。
ここではインストールディレクトリをlaravel6としています。任意の名前をつけてください。
# composer create-project --prefer-dist laravel/laravel laravel6
インストールが完了したら、macOS側からブラウザでアクセスしLaravelの初期画面が表示されるか確認を行います。
しかし、先ほどと同様にNot Foundが表示されます。先ほど任意につけたlaravel6のパスをmacOS側のlaradockフォルダの下にある.envファイルに追加する必要があります。
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のインストールは完了です。
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ファイルのデータベースの接続に関する環境変数を以下のように書き換えます。
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のバージョンが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コマンドでもコンテナの一覧を表示することができます。
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