MacでDocker×Laravel×phpMyAdminの環境構築(not laradock)

はじめに

表題通り、DockerでLaravel環境試してみました。

また、Laradockは重いので避けます。

✅参考

最強のLaravel開発環境をDockerを使って構築する【新編集版】

Laravelの開発環境をLaradockを使って構築する

☝️やはり実際の現場でLaradock使うことはないらしい。あとSequelProはMySQL8に未対応らしい。

前提

Dockerのインストール

参考:DockerをMacにインストールする(更新: 2019/7/13)

公式からインストール

アプリケーションに移動>起動※ヘルパーをインストールする

確認

% docker version
Client: Docker Engine - Community
 Azure integration  0.1.15
 Version:           19.03.12

ディレクトリ構成

.
├── backend # Laravelプロジェクトのルートディレクトリ
├── infra
│     └── docker
│          ├── mysql
│          │   ├── Dockerfile
│          │   └── my.cnf
│          ├── nginx
│          │   ├── Dockerfile
│          │   └── default.conf
│          └── php
│              ├── Dockerfile
│              ├── php-fpm.d
│              │   └── zzz-www.conf => unixドメインソケットの設定ファイル
│              └── php.ini
├── Makefile
└── docker-compose.yml

セットアップ

DCT(セキュリティ)を有効にする※.zshrcに追記

export DOCKER_CONTENT_TRUST=1

sampleAppディレクトリを作成

以下実行

$ git clone git@github.com:ucan-lab/docker-laravel.git
// その後全てのファイルをsampleApp直下に移動

makefileの編集※今回はバージョン6で作成したいため

laravel-install:
docker-compose exec app composer create-project --prefer-dist "laravel/laravel=6.*" .

プロジェクト作成

$ make create-project

これでbackendディレクトリ下にLaravelプロジェクトが生成される。(すごい)

http://localhost/にアクセス

確認

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdc0b1a457d5 sampleapp_app "docker-php-entrypoi…" 7 minutes ago Up 7 minutes 9000/tcp sampleapp_app_1
fd15a5c2f126 sampleapp_db "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp sampleapp_db_1
dbcbe560adaa sampleapp_web "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp sampleapp_web_1

make appでコンテナ内に入れたりmakefileも入念に作られていて感動!!

make sqlでDB入れる。

[mac] $ make sql
[mac] $ docker-compose exec db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'

どうやら.envを書き換えなくてもマイグレートなどできるように、ENV命令をDockerfileでしている模様。これまたすごい、、、

何も編集していない状態で以下するとマイグレートできる。

$ make migrate
docker-compose exec app 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)

※元に戻しておく

$ make sql
mysql> drop database laravel_local;
mysql> create database laravel_local;

停止

% docker-compose down
Stopping sampleapp_app_1 ... done
Stopping sampleapp_db_1 ... done
Stopping sampleapp_web_1 ... done
Removing sampleapp_app_1 ... done
Removing sampleapp_db_1 ... done
Removing sampleapp_web_1 ... done
Removing network sampleapp_default

phpMyAdminの導入※追記※

参考

docker-compose.ymlのサービス配下に以下を追記するだけ。

db:
  build: ./infra/docker/mysql
  ports:
    - 4306:3306 // 修正
  volumes:
    - db-store:/var/lib/mysql
phpmyadmin: // 👈ここから追記
  image: phpmyadmin/phpmyadmin
  environment:
    - PMA_ARBITRARY=1
    - PMA_HOST='db'
  links:
    - db
  ports:
    - 8080:80
  volumes:
    - /sessions

※ローカルのMySQLとも競合したくないのでport変えてます。

再度もろもろ作り直し。

$ make remake

http://localhost:8080/にアクセス。

サーバ:db
ユーザ名:phper
パスワード:secret

以上でログインできた👏

Reactの導入

// ここはappコンテナ内で※する必要なかったかも??
$ composer require laravel/ui "1.x" --dev
$ php artisan ui react --auth
React scaffolding installed successfully.
// 以下はローカルから
$ npm install && npm run dev
$ npm run watch // 以降自動コンパイルしてくれる。

あとは過去備忘録を参考に構築

【Laravel+React】React側からAxiosでLaravelのAPI(MySQL)叩いてデータ取得

☝️react-routerと簡単なDB取得まで

laravel+ReactでToDoアプリ※製作途中

☝️Axiosを用いて簡単なCRUD実装

おわりに

この状態でDB接続をGUIでしたかったのでいろいろ試したが後述のMySQLのバージョン違いでいろいろつまずいてしまった。
仕事のMySQLの環境が5.6系なので変更しづらい。。。
Laravelの学習は一旦ローカルでしよう。

※追記※

phpMyAdminコンテナを作れれば一番良いかもしれない。
→実装できたので、次アプリ制作するときはこの環境を使っていきたい。

メモ

・ローカルからDB接続 参考

普通にアクセスしようとするとエラーになる。

$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

サーバー起動する

$ sudo mysql.server start
Password:
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*****.pid).
$ touch /usr/local/var/mysql/*****.local.pid
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/

☝️Dockerのポートとかぶっているため。

参考:DockerのMySQLコンテナにSequelProで接続する

docker-compose.ymlを確認すると3306ポートを使っている。

$ mysql -u root -psecret -h 127.0.0.1 -P 3306
Warning: Using a password on the command line interface can be insecure.
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/Cellar/mysql@5.6/5.6.47/lib/plugin/caching_sha2_password.so, 2): image not found

参考

どうやらMySQL8系と認証方法が違う模様
→MySQLバージョン8を入れないと解決しなそう。

一応粘る。

docker-compose.ymlを編集してポートを4306にする。

再起動

$ make restart
$ mysql -u root -psecret -h 127.0.0.1 -P 4306 
Warning: Using a password on the command line interface can be insecure.
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
: dlopen(/usr/local/Cellar/mysql@5.6/5.6.47/lib/plugin/caching_sha2_password.so, 2)
: image not found

mysqlコマンドからは入れず。。。

バージョン違いが原因と思われる。

【Docker】LaravelでMySQL8.0を使う

MySQL8.0でLaravelのmigrationがエラーになる対策

☝️この記事でも同じようにMySQL8の仕様による認証方法が異なる問題の対処法が記載されている。

8だとこうなるらしい

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

5.6だと以下

mysql> SELECT user, host, plugin FROM mysql.user;
+-------------+-----------+-----------------------+
| user | host | plugin |
+-------------+-----------+-----------------------+
| root | localhost | mysql_native_password |
+-------------+-----------+-----------------------+
7 rows in set (0.00 sec)

厄介ですね〜💦

とりあえず今回は5.6で対応したい。

mysqlのDockerfileを修正

FROM mysql:5.6

再構築

$ make remake

以下のエラー

2020-09-21 06:29:49 8 [ERROR] Unknown collation: ‘utf8mb4_0900_ai_ci’

MySQL5.6が対応してないからですね💦

→おとなしくMySQLを8にすべきかもしれない。

※追記※

Xamppが最新のMySQL使っていることを思い出したので試したら成功!!

以下エイリアスを.zshrcに追加

alias xampp="/Applications/XAMPP/xamppfiles/bin/mysql"

実行で入れた。

$ xampp -u root -psecret -h 127.0.0.1 -P 4306

・MySQLのバージョンに関して。

Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する

☝️MySQL5.6自体もサポート終了しているらしい。

・docker-compose.ymlの中身

version: "3.8"
volumes:
  php-fpm-socket:
  db-store:
services:
  app:
    build: ./infra/docker/php
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ./backend:/work/backend

  web:
    build: ./infra/docker/nginx
    ports:
      - 80:80
    volumes:
      - php-fpm-socket:/var/run/php-fpm
      - ./backend:/work/backend

  db:
    build: ./infra/docker/mysql
    ports:
      - 3306:3306
    volumes:
      - db-store:/var/lib/mysql

コメントを残す