laravel
docker
LaraDock

[Docker]Dockerを触ってみたついでにLaradockも試してみた話

はじめに

ふと思い立って、おもしろそうだったのでDockerを入れてみました。
ついでにLaradockも試してみた。標準的なログイン画面を実装するところまでやってます。
今回はローカル環境を汚したくなかったのでVM上にDockerを入れてそこでコンテナを立ち上げています。

環境

項目 内容
マシン VirtualBox + vagrant上にCentOS7.4を準備
CentOS CentOS Linux release 7.4.1708 (Core)
Docker Docker version 18.06.0-ce, build 0ffa825
docker-compose docker-compose version 1.17.1, build 6d101fb

手順

VMの準備

local_console
mkdir docker-sample
cd docker-sample

vagrant box add centos/7
vagrant init centos/7
vim Vagrantfile
Vagrantfile
- # config.vm.network "private_network", ip: "192.168.33.10"
+   config.vm.network "private_network", ip: "192.168.33.10"
local_console
vagrant up

Dockerの準備

centos_console
sudo su
# 必須パッケージインストール
yum install -y yum-utils device-mapper-persistent-data lvm2
# リポジトリ追加
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yumパッケージインデックスの更新
yum makecache fast
# 最新版のインストール
yum install docker-ce
# サービス起動
systemctl start docker
# 念のためバージョンチェック
docker -v

# 自動起動
systemctl enable docker
# 毎回sudoしなくていいように権限を変更
groupadd docker
usermod -aG docker $USER
# 2018-08-13 追記:
gpasswd -a $USER docker

参考:CentOS7にDockerをインストールする
この段階ですでにDockerは利用可能になりました。
今回はLaravel用のコンテナ、 laradock を入れたかったので更に作業を続けます。

docker-composeの準備

centos_console
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > docker-compose
mv docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

参考:CentOS7.3にDocker Composeまでインストール
私の場合、ここで一旦VMを再起動する必要がありました。

local_console
vagrant halt
vagrant up --provision
centos_console
# 念のためにバージョンチェック
docker-compose -v

laradockのクローン

centos_console
sudo yum install git
git clone https://github.com/LaraDock/laradock.git
cd laradock

# docker-conposeの環境ファイルを準備
cp env-example .env

# 立ち上げ
docker-compose up -d nginx mysql
# dockerイメージにvagrantとしてログインする
# NG : 
# docker-compose exec workspace --user:vagrant bash
# OK :
docker-compose exec --user {uid} workspace bash
# 参考:uidの調べ方
whoami
# > vagrant
id vagrant
# > 1000

ご指摘いただいたwebazarashi さん、ありがとうございました!

サンプルプロジェクトの作成・設定

workspace_console
# ワークスペース内にLaravelサンプルアプリを作成する
composer -V
composer create-project laravel/laravel sample

ドキュメントルートの設定を行う。
今回はLaravelのenvファイルではなく、laradockのenvファイルを編集する点に注意

centos_console
cd laradock
vim .env
laradock/.env
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../sample
centos_console
# 一度コンテナを再起動する
docker-compose stop
docker-compose up -d nginx workspace mysql

試しに接続してみる

ローカル側のブラウザから試しにつないでみましょう。
http://192.168.33.10 と叩けばつながるはず。

DBの設定を行う

普段だったらここで php artisan migrate を叩きたいところなんですが、DBの設定を変えないとうまく通りません。

…話を統合すると、

  • docker側のenvファイルとプロジェクト側のenvファイルをMySQLのコンテナに合わせる必要がある
  • MySQL8.x系はユーザー認証方法が変わっており、設定を変更しないとmigrateできない

ということみたいです。
ちなみにMySQLのコンテナバージョンを落とそうとしたらエラーでうまくできませんでした。
ので、今回はMySQLは8.xのままで構築します。
それぞれ対応していきます。

ちなみに:その時のエラー

Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication method unknownto the client (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations)

centos_console
docker-compose exec mysql bash
mysql_console
/* MySQLにログイン */
mysql -u root -p

/* ユーザーリスト取得 */
SELECT user, host, plugin FROM mysql.user;
/*
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | caching_sha2_password | → 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 |
+------------------+-----------+-----------------------+
*/
/* 認証方式の変更 */
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'*' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

/* 標準で使用するDBを作成する */
CREATE DATABASE sample_db;
SHOW databases;

exit
centos_console
vim sample/.env
sample/.env
  DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
  DB_PORT=3306
- DB_DATABASE=homestead
+ DB_DATABASE=sample_db
- DB_USERNAME=homestead
+ DB_USERNAME=root
- DB_PASSWORD=secret
+ DB_PASSWORD=root

一度コンテナを再起動

centos_console
docker-compose stop
docker-compose up -d nginx mysql workspace

マイグレーション実行

centos_console
docker-conpose exec workspace bash
workspace_console
php artisan make:auth
php artisan migrate

…できた!これでひとまず環境はできました。