はじめに
表題通り、DockerでLaravel環境試してみました。
また、Laradockは重いので避けます。
✅参考
最強のLaravel開発環境をDockerを使って構築する【新編集版】
☝️やはり実際の現場で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
以上でログインできた👏
MailHogの導入 ※追記
参考:Docker+LaravelでMailhogを使う,LaravelでMailHogを導入して快適にメール開発をしよう!【Docker】
以下をdocker-compose.ymlに追加するだけでOK
mailhog: image: mailhog/mailhog ports: - "1025:1025" - "8025:8025"
ビルド
$ docker-compose up -d --build mailhog
DB追加
docker-compose.ymlに以下追記
db-testing: image: mysql:5.7 volumes: - db-testing-store:/var/lib/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf environment: - MYSQL_DATABASE=laravel_test - MYSQL_USER=phper - MYSQL_ROOT_PASSWORD=secret - TZ=SYSTEM ports: - 4307:3306
ビルド
$ docker-compose up -d --build db-testing
※phpmyadmin2個目作るもうまく紐づけられず。。。今後の課題です。
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 // 以降自動コンパイルしてくれる。
あとは過去備忘録を参考に構築
☝️react-routerと簡単なDB取得まで
☝️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コマンドからは入れず。。。
バージョン違いが原因と思われる。
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
コメントを残す