LaradockをWindowsにインストールしてブラウザ表示&mysqlユーザー作成&接続まで

2019年2月7日

侍エンジニア塾でPHPの学習をしています。

Laravelを使ったWEBアプリを作るのが最終的な目標なのですが、そこに至るまでにいろいろあったので技術的なことをまとめています。

PHPのフレームワークであるLaravelを扱うためにDockerというのがトレンドになる、ということでそこからやり始めました。

DockerをWindows10にインストール

Laradockをインストール

Laravelプロジェクトの作成

mysqlの起動とLaravelからの接続

このような流れです。ここに来るまで何度も心が折れながらようやくできたような気がします。

侍エンジニア塾の講師の方がDockerやLaradockを使ったことないらしく(;´・ω・)なぜか自分がこれに取り組むことになって、教材とは違う環境構築に向かってハマってしまったのがそもそもの間違いなような気がします。

でもこれからWindowsでLaravelをやろうという人が私と同じエラーにぶつかったりすると思うので、その時の参考になればいいなと思いました。

精魂尽き果てたので若干雑な記事になってましたらご勘弁を。

もはや画像の大きさや見やすさなんて関係ない、この長ったらしい作業をとにかく投稿する。

Windows 10 HomeをProにアップグレード

Dockerというのはこれから主流になるマシンを仮想化するためのツールということです。

Macだとインストールが楽なのかもしれないけど自分のPCはWindowsなので、今日のこの記事はWindowsの人が対象です。

それがなんとWindows 10 HomeとWindows 10 Proで違います。

まずWindows 10 HomeですがDocker ToolboxというHome専用のものをインストールする必要があります。
その時の記事はこちら→(https://pg-happy.jp/docker-toolbox-windows10home-install.html

ところでHome用の参考記事が無かったり、ことあるごとに躓くのでHomeでは進めない方が良いと思いました。

一応HomeでLaravelのインストールまでは出来たのですが、そのあとのmysqlで駄目になったりして、いっそのこと公式でも推奨されているProへアップグレードしてしまおうと思いました。

1万数千円かかりますが、疑心暗鬼で進んでいく時間的ロスを考えたらHomeからProにアップグレードされることをお勧めします。

HomeからProへのアップグレード方法

既にProを使っている方や、アップグレード方法がわかる方は飛ばしてください。

以下の流れに従ってアップグレードします。

Hyper-Vの有効化

以下の流れに従ってHyper-Vを有効にします。

Docker for Windowsのインストール

ここからDockerをインストールしたり設定したりを説明します。

Docker for Windowsのインストール

Windows 10 ProにはDocker for Windowsというのをインストールします。

①公式ページへアクセス
https://docs.docker.com/docker-for-windows/install/

インストールの流れなんかもここに書かれている。

②Download from Docker hubをクリック

③会員登録とログインが必要

④Get Dockerをクリックしてダウンロード

⑤Docker for Windows Installer.exeを起動

⑥画面の指示に従ってインストール作業を進めます

インストール後の確認

①Windows左下のボタンから「hyper-vマネージャー」を検索して起動

②LAPTOPというところから仮想マシンのところにMobyLinuxVMというのが出てるはず

③DockerのWelcome画面が出てくる

④Windowsの左下のボタンから「PowerShell」を検索して起動

⑤docker versionというコマンドを入力してみる

could not read CA certificate “C:\\Users\muku\\.docker\\machine\\machines\\default\\ca.pem”: open C:\Users\muku\.docker\machine\machines\default\ca.pem: The sytem cannot find the path specified.

というエラーが出ちゃった。

こちらの記事を参考にした
https://qiita.com/icck/items/60e1c1f8b6a05c8fdf72

Windows 10 HomeでDocker Toolboxをインストールしてた人が、Windows 10 Proにアップグレードして最初からやり直そうとしたときにこのエラーが出ちゃうようすです。

これらのコマンドをPowerShellから1行1行打ち込んでいきました。

PowerShellを再起動して、docker versionコマンドを入力したらバージョン情報が出たので、これでDockerのインストールがうまくいったことを確認できました。

Kitematic(カイトマティック)をインストール

カイトマティックというのはDockerをグラフィカルに操作するためのツールです。

①Windowsの右下のタスクトレイからクジラのDockerを起動してKitematicをクリック

②Downloadをクリックして、デスクトップなどに保存

③ZIPファイルを解凍して、フォルダ名をKitematicとしておき

④C:\Program Files\Docker に移動させる

Laradockのインストール

公式ページ
https://laradock.io/

ここにインストールの流れなどが書かれているけど英語なので細かい部分で作業ミスがしばしば発生してうまくなかった。

gitのインストール

Laradockのインストールの前にGitが無いと駄目なので。

Windowsを使ってる場合はgitがインストールされていなくて、laradockを取得するためのgitコマンドが使えない場合もあるのでインストールしておきます。

参考にさせていただいたサイト(http://www.curict.com/software/Windows10/Windows10_git.html

①gitの公式サイトへアクセスし
https://git-scm.com/

②Windows用のをダウンロードしてGitのインストーラを起動します

③インストーラに従って進めていきます

④PowerShellを起動して、gitコマンドを入力してみてずらっと出てくればインストールに成功していることがわかる

Laradockのクローン

クローンというのはgitというLaradockが管理されているところから取得することを意味しているらしい。

①作業フォルダを作成しておく

私の場合はC:\Users\ユーザー名\dockerworkspace

というフォルダを作ったのでここを作業場にしようとしています。

Dockerを使うと「共有」という単語がしばしば出てきます。それはWindows側から見たファイルと、Docker側から見たファイルを共有してDocker側でも使えるようにする、ということです。

ところでWindowsのUsers配下は自動的に共有ができるので、そこへ作業フォルダを作ったのです。

Users配下じゃなくてC:\直下とかに作業フォルダを作ると共有するための作業が1つ増えるので手間なので、お好きなように作業フォルダを作りましょう。

②PowerShellを起動して、cdで作業フォルダへ移動

③クローンのコマンドを入力

このコマンドでlaradockというフォルダを生成してlaradock.gitというファイルをダウンロードしてきて展開してくれる。

このあとは公式ページを見てもよい
https://laradock.io/

けどうまくいかない事が多くて、右往左往して最終的にこちらの記事を参考にさせていただきました。
https://note.mu/pasocafe/n/n8f7cf417d977
本当に感謝。

④laradockフォルダ内で.envファイルを作る

laradockフォルダ内にenv-exampleという元々あったファイルをコピーして.envというファイルを作成した。

⑤laradock/.envファイルのMYSQLの部分を編集

将来的にLaravelで作ったWEBアプリをレンタルサーバー(Xサーバー)に載せたいと思っていて、現時点のXサーバー内のmysqlバージョンが5.7.16だったので、それに合わせました。

ここは適宜自分の環境に合わせて編集。

MYSQL_DATABASEは作ろうと思ってるデータベース名
おなじくMYSQL_USERにも適当にユーザ名、MYSQL_PASSWORDにもパスワードを記述。

⑥Docker上にコンテナを起動(無ければ生成)する

PowerShellからコマンドを入力します。これはLaradockの公式ページにあったコマンド。

C:\Users\ユーザー名\dockerworkspace\laradock
というLaradockを入れたフォルダに移動してから次のコマンドを入力

このコマンドでnginx、mysql、phpmyadmin、workspaceの4つのコンテナを起動します。

nginxというのがWEBサーバーのことです。
workspaceというのがphpを動かすコンテナの様です。

初回はこれらが無いのでimageをダウンロードしてきて、そのあとコンテナが起動する仕組みだと思います。

かなり時間がかかる。次のような画面が出てくればOKだと思う。

それぞれコンテナ名称が次のようになっています。

laradock_nginx_1
laradock_mysql_1
laradock_phpmyadmin_1
laradock_workspace_1

⑦ブラウザでlocalhostにアクセスしてみる

404 Not Found nginx
という文字が出ている。

nginxというのが今回使用するWEBサーバーです。

404だけどちゃんとWEBサーバーが応答しているのがわかります。該当するルートフォルダにサイトを置けば、表示されるはずです。

⑧ブラウザでlocalhost:8080にアクセスしてみる

こちらはphpMyAdminからmysqlにアクセスできます。

サーバ:mysql
ユーザ名:root
パスワード:root

でログインできます。(下記画像はちょっと実験でやったゴミDBがあるのでスルーしてください)

あと先ほど.envファイルを作成したときに指定した

ユーザ名:myappusr
パスワード:123456

でもログインできるはず。

⑨workspaceコンテナにログインする

PowerShellから次のコマンドでlaradock_workspace_1にログインできます。

このコマンドはlaradock_workspace_1にログインしつつ、bashも使えるようにする、というコマンドです。

/var/www$
というコマンドプロンプトが出てくれば成功です。

⑩カレントディレクトリを理解する

PowerShellで今いるフォルダの中身を見るコマンドls(中のファイル一覧表示)を入力してみます。

(またもテストで作ったlaravelappやmyappフォルダが見えるが、これは無視してください。)

ということで、コンテナにログインした直後は「dockerworkspace\」に居ることがわかりました。

これは.envファイルに設定されている以下の相対パスが該当します。

つまり.envファイルの1つ上の階層に現在は指定されている、ということですね。

コンテナのIPアドレスを確認してmysqlユーザーを作成

色々と作業を進めていく中で理解したのですが、コンテナごとにIPアドレスが付与されていることがわかりました。

それで例えばmysqlに接続するユーザーに対してHOST名を指定しますよね。

その時にIPアドレスを指定しなきゃいけなくて、これに気づかなくて一生さまようところでした。

phpMyAdmin→mysqlへの接続
ターミナル→mysqlへの接続
PHP→mysqlへの接続

それぞれユーザーの権限が無いと接続できませんでした。


作業のためにPowerShellを2つ起動しました。

1つはターミナルとして使ったりdockerコマンドをする用で・・・(A)
もう1つはターミナルからmysqlへ接続する用です。・・・(B)


起動中のコンテナを確認します。PowerShell(A)で以下のコマンドを入力。

laradock_nginx_1
laradock_mysql_1
laradock_phpmyadmin_1
laradock_workspace_1

これらのコンテナが起動しているはずです。STATUSがUpになってればOKです。起動してなければ

このコマンドで再起動しておきます。

③mysqlのユーザー作成用のPowerShell(B)で

laradockフォルダに移動していることを確認してから

コマンドでmysqlコンテナにログインします。

④mysqlへrootユーザーで接続します

Enter password

と言われるので「root」と入力してログインします。

このルートユーザーが居ることすらしらなくてしかもパスワードも一緒だなんてしらなくて何日も費やしてしまいました(;´・ω・)

データベースの一覧を見てみます。

先ほどlaradock/.envファイルに記述したmyappdbというデータベースが生成されてるはずですが、ここではとりあえず無視しますね。

②コンテナのIPアドレスを確認

(A)のPowerShellで以下コマンドを入力

laradock_workspaceからexitで抜けてることを確認してから

コンテナIDはdocker psコマンドで表示されたCONTAINER IDを入力します。
今回はlaradock_workspaceのコンテナIDを指定しました。

ずらずら表示されますが、ここでIPAddressのところをメモしておきます。 172.19.0.5

③mysqlユーザーを作ってみる

(B)のPowerShellで以下コマンドを入力

すでにrootでmysqlにログインしている状態から。

このコマンドでlocalhostのmyappusrというユーザーを作成。

さらにこのコマンドで172.19.0.5のホストのmyappusr2というユーザーを作成。これはさっき確認したworkspaceコンテナのIPアドレス。

ユーザーへの権限を確定させるコマンド。必要ないかもしれないけどやっておく。

ユーザーが作成されたかを確認します。
mysqlデータベースの中を見ます。

これで

Host User
% root
172.19.0.5 myappusr2
localhost myappusr

localhostというのは今使ってるこのターミナルのことだと思います。

rootユーザーをexitしてからmysqlにmyappusrでログインしてみます。

パスワードは自分で設定した123456です。

このユーザーでDBを見ます。

このユーザーには権限がmyappdbにしかないので、これしか見れません。

localhostのmyappusrでmysqlに接続してSQL文を直で記述してテーブル作成(CREATE)や行の挿入(INSERT)もできました。

もう1人作ったmyappusr2でmysqlにログインできるか確認してみました。

myappusrはexitしてから

アクセスが拒否されましたので。このことからmysqlコンテナはlocalhostなんだな、とわかりました。

もう1人myappusr3を作ってみました。

ブラウザでlocalhost:8080へアクセスします。つまりphpMyAdminにアクセスしています。

このときmyappusr2でログインしようとするとエラーが出たので。

Access denied for user ‘myappusr2@172.19.0.3’

なのでphpMyAdminからアクセスするには172.19.0.3にユーザーが必要なんだな、と思いました。

%のワイルドカードで指定してもよいと思ったのですが。(後からだけど)

PowerShell(B)からrootユーザーでmysqlに接続して以下コマンドを入力。

これでmyappusr3を作成したら、phpMyAdminからmysqlに接続できました。

たぶんdocker psとdocker inspect コンテナIDでphpMyAdminのIPアドレスを調べたら172.19.0.3になってたはず。

あとはPHPのプログラムからmysqlに接続するためのユーザーが必要ですが、IPアドレスがわからないので保留。あとで記述。

Laravelプロジェクトを生成する

ここからLaravelプロジェクトを生成して、その中にmysqlに接続する記述をしていきます。

dockerworkspace\myappフォルダを作成して

①Laravelプロジェクト生成コマンド

引き続き、myappフォルダ内にLaravelプロジェクトを生成します。

PowerShellでdockerworkspace\laradockに移動してから以下コマンド入力。

これでlaravel_workspace_1のコンテナにログインするので、引き続きcomposerコマンドでLaravelプロジェクトを生成します。

このコマンドでOKです。

これで
dockerworkspace\myapp
というフォルダが出来て、その中にLaravelが展開されます。

一方、以下のようなコマンドでもOKです。–prefer-distを付けると圧縮ファイルをダウンロードしてきて展開してくれる、ということでこちらのコマンドの方が時短になるんだそう。

できました。

dockerworkspaceフォルダの中には
├ laradock
└ myapp

となりました。

②Laravelプロジェクトの.envを編集

今度はLaradockじゃなくて今生成したLaravelプロジェクトの.envファイルを編集します。

編集ファイルdockerworkspace\myapp\.envです。

もし.envファイルが無ければdockerworkspace\myapp\.env.exampleをコピーして.envを生成してから編集します。

.envの変更箇所は以下のとおり。

viエディタでもいいけど、自分はWindowsのサクラエディタとかAtomで編集しています。(UTF8の改行コードLFにするのを忘れない)

DB_USERNAMEのところはこれからmysqlユーザーを作るので、それにしておいてもいいし、既に作っているユーザーを入力しておけばよい。今回はmyappusr2にしてある。

ただし接続Hostがまだ不明なのでうまく接続できないかも。

いったんPowerShellのほうでコンテナからexitしてから、各コンテナを再起動しておきました。

③マイグレーションを実施

ここからデータベースを生成します。

workspaceコンテナにログインします。このコンテナの中でLaravelの様々なコマンドが使えますので。

PowerShellのほうで、cdでmyappフォルダへ移動してから

と実施。

このコマンドが何をやってるのかというと

データベース生成のためのmigrationファイルは以下の場所に最初から格納されていて、これが使われている様子。
dockerworkspace\myapp\database\migrations

この中に

create_users_table.php
create_password_resets_table.php

という2つのファイルがあって、これらが実行されてデータベースが2つ生成されます。

④生成されたテーブルの確認

phpMyAdminで確認しよう。

ブラウザでlocalhost:8080にアクセスしてphpMyAdminにログインする。

myappdbデータベースには何もテーブルがなかったけど、

上記コマンドにより

migrations
password_resets
users
というテーブルが出来ていた。

中身は空っぽだけど。

とりあえず、こういう最初からマイグレーションファイルがあるというだけで、別にこの段階でマイグレーションしなくてもいいと思う。

⑤APP_CODE_PATH_HOSTを変更

laradocworkspace\laradock\.envを編集。

に変更。

これでLaravelプロジェクトのフォルダを指定。

⑥Nginxコンテナを再起動してLaravelのサイト表示を確認

nginxのコンテナを再起動してWEBサーバーを再起動します。

先ほどはブラウザでlocalhostにアクセスすると404 Not Foundが出ていたと思いますが、

こんどは生成したLaravelプロジェクトのトップページが表示されてるはずです。

Laravelプロジェクトからmigrationを使ってDB生成、挿入

いよいよですがLaravelプロジェクトからmysqlに接続するやりかたです。

ここではmigrationファイルを作ってseedでデータベースを生成してみます。

①dockerworkspace\laradockフォルダに移動して

②workspaceコンテナにログイン

そうすると前章の.envの設定によって、dockerworkspace\myappにマウントされる。

③引き続きmigrationファイルを作成して

これで
dockerworkspace\myapp\database\migrationフォルダの中に
YYYY_MM_DD_create_customerlist_table.php
というファイルが出来た。

このファイルにテーブル定義を記述するためupメソッドを編集。

④マイグレーションを実行

⑤テーブルが生成されたか確認。

phpMyAdminからでもいいし、別のPowerShellからmysqlコンテナにログインして、mysqlに接続して確認してもよい。

これで確認できた。

⑥Seederを生成

Seederを使って、先ほど作成したテーブルに一括でデータを挿入してみます。

workspaceコンテナにログインしてる方のPowerShellでコマンド入力。

これで
dockerworkspace\myapp\database\seeds\CustomerlistTableSeeder.php
というファイルが生成されている。

⑦runメソッドを編集
このファイルのrunメソッドを以下のように編集

⑧Seederを登録

以下のファイルを編集
dockerworkspace\myapp\database\seeds\DatabaseSeeder.php

先ほど作成したCustomerlistTableSeederクラスを記述。
これで

⑨db:seedコマンドを入力

workspaceコンテナにログインしている方のPowerShellで以下コマンド入力。

⑩挿入されたか確認

mysqlコンテナにログインしている方のPowerShellで

ちゃんとデータが入ってることを確認できた。

データが入らなかったりエラーが出たとしたらたぶんmysqlユーザーを生成してないか、IPアドレスが違うとか.envの設定ミスかもしれない。

Laravelプロジェクトからmysqlに接続して読み込む

今度はLaravelプロジェクトにブラウザでアクセスしてみます。

その時にmysqlに接続して、先ほど作成したCustomerlistTableからデータを読み込んできて、表示させるところまでやってみます。

①コントローラーを作成

workspaceコンテナにログインした状態で

myapp\app\\Http\Controllers\HelloController.php
が生成される。

このファイルを編集。

このように記述。select文でcustomerlistテーブルからすべてのデータを持ってきています。

②ルーティングを指示

myapp\routes\web.php
を開いて以下のようにhelloへのアクセスに対してHelloControllerのindexメソッドを呼び出すように指示。

③ビューを作成

以下のフォルダを作成
myapp\resources\views\hello
さらにその中にindex.blade.phpファイルを新規作成。

中身を以下のように記述。

④ブラウザでアクセスして表示されるか確認する

https://localhost/hello

エラーが出てしまった。

SQLSTATE[HY000] [1045] Access denied for user ‘myappusr2’@’172.19.0.6’ (using password: YES) (SQL: select * from customerlist)

これが出ちゃう。ということはmysql接続IPは172.19.0.6ということか?

⑤mysqlへの接続ユーザーがこのIPアドレスじゃないよ、というエラーだと思う。

dockerworkspace\laradock\.env
ファイルを開いてみて

MYSQL_USER=myappusr2
のところに書かれているユーザーが居るかどうか、またHOSTに172.19.0.6が指定されているか確認を。

いない。

⑥ユーザーを作成あるいは権限付与

PowerShellでmysqlコンテナにログインして(あるいは既に2窓でPowerShellで接続してるはず)

rootでmysqlに接続。

mysqlデータベースのuserテーブルを確認してみる。

このようにHost部分に先ほどエラーが出てたIPアドレスを付与。

あとで説明しますが、このIPアドレスはphpコンテナのIPアドレスなので、それを調べて記述してもよいと思います。

というかユーザー作成のときにHostを%でやればいいと思うんだけど・・

⑦ユーザーが作成されたか確認して

⑧ブラウザでhelloに再度アクセスしてみます。

エラーが出なければ、costomerlistテーブルからデータを持ってこれましたね。