侍エンジニア塾でLaravelの開発環境をローカルに作るという事になりました。
それでLaradockを構築していきます。
LaradockのインストールのためにはまずはDockerというのが必要です。
Docker for Windows → Windows 10 Pro
Docker Toolbox → Windows 10 Home
ということで、Windows 10 Homeを使ってる私はDocker Toolboxを最初インストールすることにしました。
Dockerの会員登録とかは前回の記事に書いております。
今回はDocker Toolboxでブラウザ表示、またLaradockのインストールや設定やらがメインです。
あれこれPCを弄りまわしたせいでゴミファイルが沢山できてしまったりして大変なことに。。
約6日かかってようやくLaradockのトップページが表示されたので、そこまでのメモを残しています。
いったん全部削除
何度もインストールをやり直ししています。
ゴミファイルや残骸が残ってるとうまくいかないと思うので、いったん現時点でインストール済のものを削除しておきます。
コントロールパネルから
Oracle VM VirtualBox
Docker Toolbox
Git
これらをアンインストールして再起動しました。
以前インストール作業をしたときに作ったフォルダも削除
途中でVBoxHeadless.exeによってファイルは開かれているため操作を完了できません。
とか出てきたらタスクマネージャからこのプログラムを終了させてから、フォルダを削除。
あとはC:\Usersの配下に作成された隠しフォルダも削除。
C:\Users\muku\
.docker
.laradock
.VirtualBox
を削除
ここでPCを再起動して、ここからインストール作業を開始します。
Docker Toolboxのインストール
Docker Toolboxをダウンロードしてインストールする
Docker Quickstart Terminal、Kitematic(Alpha)、Oracle VM VirtualBoxのアイコンが出る
Docker Quickstart Terminalを起動する
ちょっと時間がかかるがくじらが出たらOK。
これでVirtualMachineの設定も同時にやってくれる様子。
画面を見れば自分のIPが192.168.99.100になってるのがわかる。
作業用ディレクトリを作成する
C:\dockerWorkspace
場所はどこでもいいので今回はC直下に作成した。このフォルダをDockerで使うために共有の設定が必要になる。
c\Users以下ならデフォルトで共有されるので設定不要で早いかもしれない。
Oracle VM VirtualBoxで共有の設定をする
設定ボタン→共有フォルダー→画面右端の+ボタン
パス:C:\dockerWorkspace
フォルダ名:c/dockerWorkspace
自動マウントと永続化するにチェックを入れる
Docker Quickstart Terminalでの設定
docker-machine ssh
でdockerに接続
以下の2コマンドを入力。
echo 'sudo mkdir -p /c/dockerWorkspace' |sudo tee -a /var/lib/boot2docker/profile
echo 'sudo mount -t vboxsf -o uid=0,gid=0 c/dockerWorkspace /c/dockerWorkspace' |sudo tee -a /var/lib/boot2docker/profile
と入力。
dockerからexitで抜けて、
dockerを再起動
docker-machine restart
これでC:\dockerWorkspaceが共有ディレクトリとして設定される。
Laradockをインストール(クローン)する
Docker Quickstart Terminalを起動して
cd /c/dockerWorkspace
に移動。
Laradockをクローンする。
git clone -b LaraDock-ToolBox https://github.com/LaraDock/laradock.git
これで laradockフォルダが生成される。
Docker for Windows(Windows 10 Pro用のやつ)ならこっちのコマンドだけど、
git clone https://github.com/Laradock/laradock.git
Windows 10 Home用のDocker Toolboxの場合はブランチの方を使うらしい。
クローンして出来たlaradockフォルダの中に.envファイルを作っていきます。
laradockフォルダに入る。
cd laradock
.envファイルをコピーして生成。
cp env-example .env
docker-machine restart
でリスタートすること。(リスタートがどのタイミングで必要かは実はわかっていない、envとか設定関連をいじったらリスタートしようと思う)
公式サイトにならってコンテナを起動
docker-compose up -d nginx mysql phpmyadmin redis workspace
ここは結構時間がかかる。
こんなエラーが出ることがある。
ERROR: The Compose file ‘.\docker-compose.yml’ is invalid because:
これはlaradock直下に.envが無いことが原因。上のように.envファイルをコピーして生成しておくことを忘れない。
こんなエラーもある。
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
ちゃんとlaradockへcdで移動してからコマンドを入力すること。
おかしいなと思ったらDocker Quickstart Terminalを再起動したりdocker-machine restartしてからやる。
Terminalを閉じてまた起動しただけでは、中身のコンテナとか再起動しないっぽい。
実行中のコンテナを確認
$ docker ps
以下のような結果が出るはず。
9b6ee908ef6b laradock_nginx “nginx” About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1
7818f673dd5c laradock_php-fpm “php-fpm” About a minute ago Up About a minute 9000/tcp laradock_php-fpm_1
b445e4232478 laradock_phpmyadmin “/run.sh supervisord…” About a minute ago Up About a minute 9000/tcp, 0.0.0.0:88->80/tcp laradock_phpmyadmin_1
2b4e2d739e50 laradock_workspace “/sbin/my_init” About a minute ago Up About a minute 0.0.0.0:2222->22/tcp laradock_workspace_1
f8c6af168158 laradock_redis “docker-entrypoint.s…” About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp laradock_redis_1
色々出てくるはず。出てこないとしたらimagesのダウンロードやコンテナの生成に失敗している。
出てこなかったら
docker images
と打ち込んでみよう。結果が何もなければ前述の.envコピーをやっていない可能性がある。
IMAGEがlaradock_nginxというのがあれば、これがWEBサーバー。STATUSがUpになっていればWEBサーバーが起動してるということなので
念のためローカルPCを調べる
docker-machine ip
これで出てきたIPアドレスにブラウザでhttp://192.168.99.100/にアクセスしてみる。
コンテンツが無いので404のエラーが返るはず。これでnginxのWEBサーバーは起動してることが確認できた。
404が返らない(接続できませんとか)ならWEBサーバーが起動していない状態。
laradock_nginxのSTATUSがExit(2)とかになってたら起動できていない。
【補足】
手順を見直したり
docker-machine restartして
docker-compose up -d nginx mysql phpmyadmin redis workspace をやってみるとよいかも。
コンテナの起動は
docker start CONTAINER ID か NAME で起動することができる。
例)docker start 9b6ee908ef6b
コンテナの停止は
docker stop CONTAINER ID か NAME で停止することができる。
例)docker stop 9b6ee908ef6b
さて、nginxの設定ファイルを開いてみる。
C:\dockerWorkspace\laradoc\nginx\sites\default.conf
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name locahost; root /var/www/public;
と書かれている。このrootのところがhttp://192.168.99.100/でアクセスしたときのトップページになるので、ここにindex.htmlとかを置けばそれが表示されるはず。
/var/www/というのはどこかというと
作成した作業フォルダ
C:\dockerWorkspace\
この中にlaradockをクローンしたので
C:\dockerWorkspace\laradock
となっているはずだけど。
このdockerWorkspace階層が/var/www/とリンクされている。
なので
C:\dockerWorkspace\public
というフォルダを作り、この中にindex.htmlでも置けばこれが表示される。
ちなみに
C:\dockerWorkspace\laradock\docker-compose.yml
を見ると
### Applications Code Container ############################# applications: image: tianon/true volumes: - ${APPLICATION}:/var/www
と書かれていて、volumesのところがホスト側と仮想側のリンク対応を表している。
APPLICATIONというのは
C:\dockerWorkspace\laradock\.env
に記載がある。
### Application # Point to your application code, wish should be available at `/var/www` APPLICATION=../
APPLICATION=のところが../と書かれているので.envの上の階層(つまりdockerWorkspace)=/var/www/としていることがわかる。
とりあえずここまででnginxが動いている事が確認できればOK。
Laravelプロジェクトの作成
実行中のコンテナにログイン(アタッチ)する。
ログインするコンテナはdocker psで調べたlaradock_workspace_1
docker exec -it laradock_workspace_1 /bin/bash
-i コンテナの標準入力を開く
-t ttyp(端末デバイス)を確保
/bin/bashなどでコンテナを操作する際に指定
こんな結果が出た。
muku@LAPTOP-LRJ8P6CR MINGW64 /c/dockerWorkspace/laradock (LaraDock-ToolBox) $ docker exec -it laradock_workspace_1 /bin/bash bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: $'\r': command not found bash: /home/laradock/aliases.sh: line 61: syntax error near unexpected token `$'{\r'' 'ash: /home/laradock/aliases.sh: line 61: `function mkd() { root@2b4e2d739e50:/var/www#
エラーっぽいのがずらずら出たけどコンテナにログインできたようなプロンプトが出た。。なにこれ?
Windowsで シェルを実行した場合、改行コードのせいでエラーが発生する場合がある
でもWindowsでファイル編集してないよな・・?これは後で侍エンジニア塾の先生に聞いてみよう‥
ここに対策があった。
https://github.com/laradock/laradock/issues/563
以下コマンドでエラーが出た後、
docker exec -it laradock_workspace_1 /bin/bash
そのまま引き続き以下コマンドを入力してエラーが出ているaliases.shファイルを修正。
sed -i 's/\r//' /home/laradock/aliases.sh sed -i 's/^#! \/bin\/sh/#! \/bin\/bash/' /home/laradock/aliases.sh
これでエラーがでなくなった。
コンポーザーを使ってLaravelプロジェクトを生成
composer create-project laravel/laravel laraveltest --prefer-dist
Do not run Composer as root/super user!って出た。
root/superユーザーで実行するなと怒られるが、処理は進む。
たぶん本来は–userを付けるのだと思う。やり方はわからないからこのまま進む。
Laravelプロジェクト配下に.envをコピーして作成
ls -aでlaraveltest配下の隠しファイル含めてリストを確認。
cp .env.example .env
で.envファイルをコピーして作成。
公式サイトに従い.envの中身を編集。編集はWindowsのエディタでやった。文字コードUTF8、改行コードLFで保存するのを忘れない。
DB_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
↓
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
トップページでLaravelプロジェクトのpubilc配下を表示させる設定
今のところローカルホストにブラウザでアクセスすると、先ほどの
/var/www/public
に入ってるindex.htmlが表示されてしまう。
これを作成したLaravelプロジェクトの中のpublicフォルダに指定を切り替える必要がある。
やり方が3通りあると思う。
①nginxの設定ファイル編集
C:\dockerWorkspace\laradoc\nginx\sites\default.conf
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name locahost; root /var/www/public;
rootのところを作成したLaravelプロジェクトのpublicに指定。
root /var/www/laraveltest/public;
②もしくは
C:\dockerWorkspace\laradock\docker-compose.yml
の
### Applications Code Container ############################# applications: image: tianon/true volumes: - ${APPLICATION}:/var/www
を編集してもよいのかも。
${APPLICATION}のところをlaraveltest直打ちに変更。
③それか
C:\dockerWorkspace\laradock\.env
の以下の部分を編集か。
APPLICATION=../
↓
APPLICATION=../laraveltest
ていうかこれがいいんじゃないかと思う。
編集したら保存して終了。
laradockフォルダに移動して
docker-machine restart
で再起動。
docker-compose up -d nginx mysql phpmyadmin redis workspace
でコンテナ立ち上げ。
(再起動は要らないかもしれない)
これでブラウザでアクセスしてLaravelのトップページが表示されればOKだけど、自分はエラーが出た。
【補足】
ブラウザアクセスしたときに
みたいなエラーが出たら、DEBUGモードをONにすると詳細なエラーがわかる。
C:\dockerWorkspace\laraveltest/config/app.php
を開いて以下のように編集。
'debug' => env('APP_DEBUG', true),
envの第2引数をtrueにする。
これでエラー詳細が出たりする。自分の場合は以下のエラーが出てた。
No application encryption key has been specified.
ということで人によってはこのエラーに従って、KEYを生成する必要がある。
KEYはcomposerによって自動生成してくれる場合もある様子。だけど私の場合は自作しなければいけなかった。
LaravelプロジェクトにKEYを設定
ワークスペースコンテナにログインして
docker exec -it laradock_workspace_1 /bin/bash
これでログインすると、ログイン直後の位置が
C:\dockerWorkspace\laradock\.env
のAPPLICATION=で設定したフォルダになってることがわかる。
つまりプロジェクトのルートディレクトリにて、
以下のキー生成コマンドを入力(.envファイル編集中なら閉じておこう)
php artisan key:generate
これで
Application key [base64:hogehogehogehogehogeho] set successfully.
みたいに出ればOk。
結果
これでキーが生成された。
さらに.envファイルを試しに開いてみてにAPP_KEY=base64:なんちゃら
というのが出来てることもわかる。
AWSのCloud9環境を使ってcomposerでLaravelをインストールしてたときはKEYなんて生成したことないんだけど。
composerのバージョンが古いのかなぁ?
これでブラウザでhttp://192.168.99.100/にアクセスすると、Laravelのトップページが表示された!!
苦節5人日かけてようやくたどり着きました。。(´・ω・`)
参考文献
Laradock公式 http://laradock.io/
Laradockをwindows10で使う https://qiita.com/ProjectEuropa/items/29ced68928374e52544d