目次
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/) ところでHome用の参考記事が無かったり、ことあるごとに躓くのでHomeでは進めない方が良いと思いました。 一応HomeでLaravelのインストールまでは出来たのですが、そのあとのmysqlで駄目になったりして、いっそのこと公式でも推奨されているProへアップグレードしてしまおうと思いました。 1万数千円かかりますが、疑心暗鬼で進んでいく時間的ロスを考えたらHomeからProにアップグレードされることをお勧めします。HomeからProへのアップグレード方法
既にProを使っている方や、アップグレード方法がわかる方は飛ばしてください。 以下の流れに従ってアップグレードします。
Hyper-Vの有効化
以下の流れに従ってHyper-Vを有効にします。
Docker for Windowsのインストール

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にアップグレードして最初からやり直そうとしたときにこのエラーが出ちゃうようすです。
[Environment]::SetEnvironmentVariable("DOCKER_CERT_PATH", $null, "User")
[Environment]::SetEnvironmentVariable("DOCKER_HOST", $null, "User")
[Environment]::SetEnvironmentVariable("DOCKER_MACHINE_NAME", $null, "User")
[Environment]::SetEnvironmentVariable("DOCKER_TLS_VERIFY", $null, "User")
[Environment]::SetEnvironmentVariable("DOCKER_TOOLBOX_INSTALL_PATH", $null, "User")
これらのコマンドを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で作業フォルダへ移動git clone https://github.com/LaraDock/laradock.git laradock
このコマンドでlaradockというフォルダを生成してlaradock.gitというファイルをダウンロードしてきて展開してくれる。
このあとは公式ページを見てもよい
https://laradock.io/
けどうまくいかない事が多くて、右往左往して最終的にこちらの記事を参考にさせていただきました。
https://note.mu/pasocafe/n/n8f7cf417d977
本当に感謝。
④laradockフォルダ内で.envファイルを作る
cd laradock cp env-example .env
MYSQL_VERSION=5.7.16 MYSQL_DATABASE=myappdb MYSQL_USER=myappusr MYSQL_PASSWORD=123456将来的にLaravelで作ったWEBアプリをレンタルサーバー(Xサーバー)に載せたいと思っていて、現時点のXサーバー内のmysqlバージョンが5.7.16だったので、それに合わせました。 ここは適宜自分の環境に合わせて編集。 MYSQL_DATABASEは作ろうと思ってるデータベース名 おなじくMYSQL_USERにも適当にユーザ名、MYSQL_PASSWORDにもパスワードを記述。 ⑥Docker上にコンテナを起動(無ければ生成)する PowerShellからコマンドを入力します。これはLaradockの公式ページにあったコマンド。 C:\Users\ユーザー名\dockerworkspace\laradock というLaradockを入れたフォルダに移動してから次のコマンドを入力
docker-compose up -d nginx mysql phpmyadmin workspace
このコマンドで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にログインできます。
docker-compose exec --user=laradock workspace bash
APP_CODE_PATH_HOST=../つまり.envファイルの1つ上の階層に現在は指定されている、ということですね。
コンテナのIPアドレスを確認してmysqlユーザーを作成

docker ps
laradock_nginx_1
laradock_mysql_1
laradock_phpmyadmin_1
laradock_workspace_1
これらのコンテナが起動しているはずです。STATUSがUpになってればOKです。起動してなければ
docker-compose up -d nginx mysql phpmyadmin workspaceこのコマンドで再起動しておきます。 ③mysqlのユーザー作成用のPowerShell(B)で laradockフォルダに移動していることを確認してから
docker exec -it laradock_mysql_1 /bin/bashコマンドでmysqlコンテナにログインします。
④mysqlへrootユーザーで接続します
mysql -u root -pEnter password と言われるので「root」と入力してログインします。
このルートユーザーが居ることすらしらなくてしかもパスワードも一緒だなんてしらなくて何日も費やしてしまいました(;´・ω・)
データベースの一覧を見てみます。
mysql> show database; +--------------------+ | Database | +--------------------+ | information_schema | | myappdb | | mysql | | performance_schema | | sys | +--------------------+
先ほどlaradock/.envファイルに記述したmyappdbというデータベースが生成されてるはずですが、ここではとりあえず無視しますね。
②コンテナのIPアドレスを確認
(A)のPowerShellで以下コマンドを入力
laradock_workspaceからexitで抜けてることを確認してから
docker inspect コンテナID
GRANT ALL PRIVILEGES ON myappdb.* TO myappusr@localhost IDENTIFIED BY '123456';このコマンドでlocalhostのmyappusrというユーザーを作成。
GRANT ALL PRIVILEGES ON myappdb.* TO 'myappusr2'@'172.19.0.5' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
use mysql select Host, User, Select_priv, Insert_priv from user;これで
| Host | User |
|---|---|
| % | root |
| 172.19.0.5 | myappusr2 |
| localhost | myappusr |
localhostというのは今使ってるこのターミナルのことだと思います。
rootユーザーをexitしてからmysqlにmyappusrでログインしてみます。
mysql -u myappusr -pパスワードは自分で設定した123456です。
このユーザーでDBを見ます。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | myappdb | +--------------------+
このユーザーには権限がmyappdbにしかないので、これしか見れません。
localhostのmyappusrでmysqlに接続してSQL文を直で記述してテーブル作成(CREATE)や行の挿入(INSERT)もできました。
mysql> use myappdb
Database changed
mysql> create table `people` (
-> `id` integer primary key auto_increment,
-> `name` text not null,
-> `mail` text,
-> `age` integer
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO `people` VALUES (1, 'honda', 'honda@pg-happy.jp', 40); Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO `people` VALUES (2, 'toyota', 'toyota@pg-happy.jp', 30); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `people` VALUES (3, 'hawaii', 'hawaii@pg-happy.jp', 15); Query OK, 1 row affected (0.01 sec) mysql> select * from people; +----+--------+--------------------+------+ | id | name | mail | age | +----+--------+--------------------+------+ | 1 | honda | honda@pg-happy.jp | 40 | | 2 | toyota | toyota@pg-happy.jp | 30 | | 3 | hawaii | hawaii@pg-happy.jp | 15 | +----+--------+--------------------+------+
もう1人作ったmyappusr2でmysqlにログインできるか確認してみました。
myappusrはexitしてから
mysql -u myappusr2 -p Access denied for user 'myappusr2'@'localhost'アクセスが拒否されましたので。このことから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に接続して以下コマンドを入力。
GRANT ALL PRIVILEGES ON myappdb.* TO 'myappusr3'@'172.19.0.3' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
たぶん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に移動してから以下コマンド入力。
docker-compose exec --user=laradock workspace bash
composer create-project laravel/laravel myappこのコマンドでOKです。
これで
dockerworkspace\myapp
というフォルダが出来て、その中にLaravelが展開されます。
一方、以下のようなコマンドでもOKです。–prefer-distを付けると圧縮ファイルをダウンロードしてきて展開してくれる、ということでこちらのコマンドの方が時短になるんだそう。
composer create-project laravel/laravel src --prefer-distできました。 dockerworkspaceフォルダの中には ├ laradock └ myapp となりました。 ②Laravelプロジェクトの.envを編集 今度はLaradockじゃなくて今生成したLaravelプロジェクトの.envファイルを編集します。 編集ファイルdockerworkspace\myapp\.envです。 もし.envファイルが無ければdockerworkspace\myapp\.env.exampleをコピーして.envを生成してから編集します。
cd myapp cp .env.example .env.envの変更箇所は以下のとおり。 viエディタでもいいけど、自分はWindowsのサクラエディタとかAtomで編集しています。(UTF8の改行コードLFにするのを忘れない)
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=myappdb DB_USERNAME=myappusr DB_PASSWORD=123456DB_USERNAMEのところはこれからmysqlユーザーを作るので、それにしておいてもいいし、既に作っているユーザーを入力しておけばよい。今回はmyappusr2にしてある。 ただし接続Hostがまだ不明なのでうまく接続できないかも。 いったんPowerShellのほうでコンテナからexitしてから、各コンテナを再起動しておきました。
docker-compose up -d nginx mysql phpmyadmin workspace
③マイグレーションを実施
ここからデータベースを生成します。
workspaceコンテナにログインします。このコンテナの中でLaravelの様々なコマンドが使えますので。
docker-compose exec --user=laradock workspace bashPowerShellのほうで、cdでmyappフォルダへ移動してから
php artisan migrateと実施。
このコマンドが何をやってるのかというと
データベース生成のための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を編集。
APP_CODE_PATH_HOST=../myappに変更。
これでLaravelプロジェクトのフォルダを指定。
⑥Nginxコンテナを再起動してLaravelのサイト表示を確認
docker-compose up -d nginxnginxのコンテナを再起動してWEBサーバーを再起動します。
先ほどはブラウザでlocalhostにアクセスすると404 Not Foundが出ていたと思いますが、
こんどは生成したLaravelプロジェクトのトップページが表示されてるはずです。
Laravelプロジェクトからmigrationを使ってDB生成、挿入

docker-compose exec --user=laradock workspace bashそうすると前章の.envの設定によって、dockerworkspace\myappにマウントされる。 ③引き続きmigrationファイルを作成して
php artisan make:migration create_customerlist_table
これで
dockerworkspace\myapp\database\migrationフォルダの中に
YYYY_MM_DD_create_customerlist_table.php
というファイルが出来た。
このファイルにテーブル定義を記述するためupメソッドを編集。
public function up()
{
Schema::create('customerlist', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email');
$table->integer('age');
$table->string('address');
$table->string('tel');
$table->timestamps();
});
}
④マイグレーションを実行
php artisan migrate
show tables; desc customerlist;これで確認できた。
⑥Seederを生成
Seederを使って、先ほど作成したテーブルに一括でデータを挿入してみます。
workspaceコンテナにログインしてる方のPowerShellでコマンド入力。
php artisan make:seeder CustomerlistTableSeeder
⑦runメソッドを編集
このファイルのrunメソッドを以下のように編集
public function run()
{
$param = [
'name' => 'ueno',
'email' => 'ueno@yamatesen.org',
'age' => 20,
'address' => 'UENO',
'tel' => '0120-123-4567',
];
DB::table('customerlist')->insert($param);
$param = [
'name' => 'sinagawa',
'email' => 'sinagawa@yamatesen.org',
'age' => 30,
'address' => 'SINAGAWA',
'tel' => '0120-123-4568',
];
DB::table('customerlist')->insert($param);
$param = [
'name' => 'sinjuku',
'email' => 'sinjuku@yamatesen.org',
'age' => 18,
'address' => 'SINJUKu',
'tel' => '0120-123-4569',
];
DB::table('customerlist')->insert($param);
}
⑧Seederを登録
以下のファイルを編集
dockerworkspace\myapp\database\seeds\DatabaseSeeder.php
先ほど作成したCustomerlistTableSeederクラスを記述。
これで
public function run()
{
$this->call(CustomerlistTableSeeder::class);
}
⑨db:seedコマンドを入力
workspaceコンテナにログインしている方のPowerShellで以下コマンド入力。
php artisan db:seed
select * from customerlist;
ちゃんとデータが入ってることを確認できた。
データが入らなかったりエラーが出たとしたらたぶんmysqlユーザーを生成してないか、IPアドレスが違うとか.envの設定ミスかもしれない。
Laravelプロジェクトからmysqlに接続して読み込む
今度はLaravelプロジェクトにブラウザでアクセスしてみます。 その時にmysqlに接続して、先ほど作成したCustomerlistTableからデータを読み込んできて、表示させるところまでやってみます。 ①コントローラーを作成 workspaceコンテナにログインした状態でphp artisan make:controller HelloController
このファイルを編集。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class HelloController extends Controller
{
public function index(Request $request)
{
$items = DB::select('select * from customerlist');
return view('hello.index', ['items' => $items]);
}
}
このように記述。select文でcustomerlistテーブルからすべてのデータを持ってきています。
②ルーティングを指示
myapp\routes\web.php
を開いて以下のようにhelloへのアクセスに対してHelloControllerのindexメソッドを呼び出すように指示。
Route::get('/', function () {
return view('welcome');
});
Route::get('hello', 'HelloController@index');
③ビューを作成
以下のフォルダを作成
myapp\resources\views\hello
さらにその中にindex.blade.phpファイルを新規作成。
中身を以下のように記述。
<html>
<head>
<title>こんにちはmysql</title>
</head>
<body>
<h1>こんにちはmysql</h1>
<table>
<tr><th>名前</th><th>メール</th><th>年齢</th><th>住所</th><th>電話</th></tr>
@foreach ($items as $item)
<tr>
<td>{{$item->name}}</td>
<td>{{$item->email}}</td>
<td>{{$item->age}}</td>
<td>{{$item->address}}</td>
<td>{{$item->tel}}</td>
</tr>
@endforeach
</table>
</body>
</html>
④ブラウザでアクセスして表示されるか確認する
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で接続してるはず)
docker exec -it laradock_mysql_1 /bin/bashrootでmysqlに接続。
mysql -u root -pmysqlデータベースのuserテーブルを確認してみる。
use mysql select Host, User from user;このようにHost部分に先ほどエラーが出てたIPアドレスを付与。
GRANT ALL PRIVILEGES ON myappdb.*TO 'myappusr2'@'172.19.0.6' IDENTIFIED BY '123456';あとで説明しますが、このIPアドレスはphpコンテナのIPアドレスなので、それを調べて記述してもよいと思います。 というかユーザー作成のときにHostを%でやればいいと思うんだけど・・ ⑦ユーザーが作成されたか確認して
select Host, User from user;
⑧ブラウザでhelloに再度アクセスしてみます。
エラーが出なければ、costomerlistテーブルからデータを持ってこれましたね。



