Help us understand the problem. What is going on with this article?

【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン

概要

docker(docker-compose)でLEMP環境(PHP7.3/nginx1.17/MySQL8.0/Laravel6.0)を構築し、Laravelの新規プロジェクト作成、構築した環境を破棄してから環境の再構築までをハンズオン形式で行います。

ハンズオン終了時のGitHub

https://github.com/ucan-lab/docker-laravel-handson

ハンズオンイベント

【ぺちオブ】ゆーきゃんプレゼンツ!Laravel + Docker 環境構築ハンズオン

https://phper-oop.connpass.com/event/137152

あの有名なぺちオブのイベントとしてハンズオン講師をやらせていただきました!
ありがとうございます🙏

レビュワー

スペシャルサンクス🙇‍♂️🙏

前提条件

  • Mac基準ですが、Windowsでも動作することを確認済み
  • コマンドは [環境] $ とprefixを付けてます。
  • 所要時間は事前準備部分を除いて20分を目安としてます。
  • エディタはファイル編集時にお好みのもので開いて作業ください🙏

構築環境

  • php: 7.3-fpm-alpine
  • nginx: 1.17-alpine
  • mysql: 8.0
  • Laravel: 6.0

dockerおすすめ書籍

マンガでわかるdockerシリーズ

@llminatoll さんがDockerについてマンガで分かりやすく説明されてます。
初めての方はこちらのマンガでDockerの概念を学んでから進めると理解しやすいです。

dockerおすすめ記事・サイト

公式系

記事

スライド

事前準備

Windowsユーザー

Git Bashのインストールをお願いします。(Linuxコマンドをそのまま打てるようになります)

Git Bash を起動した際は下記のコマンドを実行ください。

$ exec winpty bash

GitHubアカウントの作成

Gitの初期設定

$ git config --list | grep user
user.email=info@u-can.tech
user.name=ゆうきゃん

user.emailuser.name が設定されていればok!
Gitの初期設定を行ってない場合、下記の記事を参考に初期設定をお願いします。

Mac Git 初期設定

GitHub SSH接続設定

$ ssh -T github.com
Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts.
Hi ucan-lab! You've successfully authenticated, but GitHub does not provide shell access.

successfully authenticated の文字が出ればok!
Warningは気にしなくてok!

GitHub SSH接続設定を行ってない場合、下記の記事を参考に初期設定をお願いします。
もしくはハンズオンをHTTPSに置き換えて進めてください。

Mac GitHub SSH接続設定

docker, docker-compose のインストール

[Mac] Docker for Macをインストール

[Windows] Docker for Windowsをインストール

イントール確認

[mac] $ docker --version
Docker version 19.03.1, build 74b1e89

[mac] $ docker-compose --version
docker-compose version 1.24.1, build 4667896b

Docker起動確認

インストールしたDockerを起動してください。
running 状態になっていればokです。

スクリーンショット 2019-09-29 1.39.55.png


ここまでで事前準備終了です。


今回のハンズオンのゴール

  • 3層アーキテクチャのコンテナの構築
    • ウェブサーバー(web)
      • nginxで静的コンテンツ配信サーバを構築
    • アプリケーションサーバー(app)
      • nginxを経由してPHPを動作させるアプリケーションサーバを構築
      • PHPパッケージ管理ツールComposerのインストール
    • データベースサーバー(db)
      • MySQLデータベースサーバーの構築
  • Laravelをインストールしてwelcome画面の表示
  • LaravelとMySQLを連携し、マイグレーションを実行
  • Docker環境の破棄
  • Docker環境をGitHubから再構築

🐳【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン🐳

  • 所要時間: 20分目安

作業ディレクトリを作成

[mac] $ mkdir docker-laravel-handson
[mac] $ cd docker-laravel-handson

最終的なディレクトリ構成

.
├── README.md
├── docker
│   ├── mysql
│   │   └── my.cnf
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── docker-compose.yml
├── logs
│   ├── access.log
│   ├── error.log
│   ├── mysql-error.log
│   ├── mysql-query.log
│   ├── mysql-slow.log
│   └── php-error.log
└── src
    └── readme.md

このディレクトリ構成を目指します。

リモートリポジトリを作成

https://github.com/new

GitHub Create remote repository
GitHub docker-laravel-handson

リポジトリ名 docker-laravel-handson のGitHubリモートリポジトリを作成する。

リモートリポジトリへ初回コミット&プッシュ

[mac] $ echo "# docker-laravel-handson" > README.md
[mac] $ echo "/logs" > .gitignore
[mac] $ git init
[mac] $ git add .
[mac] $ git commit -m "first commit"

リモートリポジトリを登録します。
リモートリポジトリ先は適宜置き換えてください。

[mac] $ git remote add origin git@github.com:ucan-lab/docker-laravel-handson.git

リモートリポジトリ先が正しく設定されていることを確認してください。

[mac] $ git remote -v
origin  git@github.com:ucan-lab/docker-laravel-handson.git (fetch)
origin  git@github.com:ucan-lab/docker-laravel-handson.git (push)

# もしリモートリポジトリ先を間違えた場合は下記のコマンドから変更できます。
[mac] $ git remote set-url origin <リモートリポジトリ>

リモートリポジトリ先の名前を origin と付けられていること。
リモートリポジトリ先のURL等に間違いがないことを確認する。

GitHubへpushします。

[mac] $ git push -u origin master
  • -u オプションは --set-upstream の省略
    • ローカルリポジトリの現在のブランチ(master)をリモートリポジトリ(origin)のmasterにpush先を設定
    • 以降は git push だけで git push origin master と同義

GitHubのリモートリポジトリのmasterブランチへpushされていることを確認します。

環境ファイル(.env)を作成

[mac] $ touch .env
DB_NAME=homestead
DB_USER=homestead
DB_PASS=secret
TZ=Asia/Tokyo
  • データベースの接続情報とタイムゾーンを環境変数として設定

アプリケーションサーバ(app)コンテナを作る

PHPアプリケーションサーバコンテナを作成します。
公式のPHP-FPMイメージをベースイメージとしてカスタマイズします。

ディレクトリ構成

.
├── docker
│   └── php
│       ├── Dockerfile
│       └── php.ini # PHPの設定ファイル
├── docker-compose.yml
├── logs
│   └── php-error.log
└── src # Laravelをインストールするディレクトリ

docker-compose.yml

[mac] $ touch docker-compose.yml

作成した docker-compose.yml を下記の通りに編集します。

version: "3"
services:
  app:
    build:
      context: ./docker/php
      args:
        - TZ=${TZ}
    volumes:
      - ./src:/work
      - ./logs:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /work
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USER}
      - DB_PASSWORD=${DB_PASS}
      - TZ=${TZ}
  • docker-compose.yml ファイルはインデント(半角スペース)が意味を持ちます。注意してコピペしてください。
  • .env の値を ${環境変数名}docker-compose.yml に受け渡しできる
  • argsTZ は Dockerfile で使用
  • environmentTZ は php.ini で使用
  • environmentDB_* 設定値はLaravel設定用の環境変数

./docker/php/Dockerfile

  • タイムゾーン設定
  • Composerコマンドのインストール
  • Laravelで必要なPHP拡張機能のインストール
    • bcmath, pdo_mysql が不足しているので追加インストール
[mac] $ mkdir -p docker/php
[mac] $ touch docker/php/Dockerfile
FROM php:7.3-fpm-alpine
LABEL maintainer "your-name"

ARG TZ
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer

RUN set -eux && \
  apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \
  cp /usr/share/zoneinfo/${TZ} /etc/localtime && \
  apk del .build-dependencies && \
  docker-php-ext-install bcmath pdo_mysql && \
  curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \
  composer config -g repos.packagist composer https://packagist.jp && \
  composer global require hirak/prestissimo

./docker/php/php.ini

php.ini はPHPの設定ファイル

  • PHPエラーメッセージの設定
  • PHPエラーログの設定
  • メモリ等の設定(お好みで)
  • タイムゾーン設定
  • 文字コード設定
[mac] $ touch docker/php/php.ini
php.ini
error_reporting = E_ERROR | E_WARNING | E_PARSE | E_NOTICE
display_errors = stdout
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
upload_max_filesize = -1
memory_limit = -1
post_max_size = 100M
max_execution_time = 900
max_input_vars = 100000
default_charset = UTF-8

[Date]
date.timezone = ${TZ}

[mbstring]
mbstring.language = Japanese

build & up

  • appコンテナの作成
  • PHPのバージョン確認
  • Laravelで必要なPHP拡張機能の確認
[mac] $ docker-compose up -d --build
  • docker-compose コマンドは docker-compose.yml があるディレクトリで実行します。
  • docker-compose updocker-compose.yml に定義したサービスを起動します。
  • -d 「デタッチド」モードでコンテナを起動します。
    • デフォルトは「アタッチド」モードで全てのコンテナログを画面上に表示
    • 「デタッチド」モードではバックグラウンドで動作
  • --build コンテナの開始前にイメージを構築します
    • 特に変更がない場合はキャッシュが使用されます。
[mac] $ docker-compose ps
            Name                          Command              State    Ports  
-------------------------------------------------------------------------------
docker-laravel-handson_app_1   docker-php-entrypoint php-fpm   Up      9000/tcp
  • docker-compose ps コンテナ一覧を表示します。

docker-laravel-handson_app_1 コンテナの State が Up になっていたら正常に起動している状態です。

PHPのバージョン確認(コンテナに入ってコマンド実行)

作成したPHPコンテナの中に入ってPHPのバージョンを確認します。

[mac] $ docker-compose exec app ash

/work # php -v
PHP 7.3.8 (cli) (built: Aug  2 2019 06:11:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

/work # php -m
[PHP Modules]
bcmath
ctype
json
mbstring
openssl
PDO
pdo_mysql
tokenizer
xml

(長いので省略してます)

exit でコンテナの外に出ます。

[app] $ exit

control + d でもコンテナから出られます。

補足説明

appコンテナ内に入ってphpコマンドを実行しています。

  • docker-compose exec 実行中のコンテナ内で、コマンドを実行します。
  • app サービス名(コンテナ名)を指定します。
  • ash appコンテナ内でashシェルを実行します。
    • Almquist Shell(アルムクィストシェル)
    • 環境変数PATH等は ~/.profile 設定する

PHPのバージョン確認(コンテナの外からコマンド実行)

コンテナの外から php コマンドを実行することもできます。

[mac] $ docker-compose exec app php -v
PHP 7.3.8 (cli) (built: Aug  2 2019 06:11:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

結果にコミット

[mac] $ git status
[mac] $ git add .
[mac] $ git status
[mac] $ git commit -m "feat create docker app container"
[mac] $ git log

ウェブサーバー(web)コンテナを作る

nginxウェブサーバーコンテナを作成します。
nginxのベースイメージをそのまま利用します。

ディレクトリ構成

.
├── docker
│   └── nginx
│       └── default.conf # nginxの設定ファイル
├── docker-compose.yml
├── logs
│   ├── access.log # nginxのアクセスログ
│   └── error.log # nginxのエラーログ
└── src
    └── public # 動作確認用に作成
        ├── index.html # HTML動作確認用
        └── phpinfo.php # PHP動作確認用

docker-compose.yml

  • appコンテナの起動順序を設定
  • ポート転送の設定(今回は10080ポートにする)
  • タイムゾーンの設定
  web:
    image: nginx:1.17-alpine
    depends_on:
      - app
    ports:
      - 10080:80
    volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}
  • docker-compose.yml ファイルはインデント(半角スペース)が意味を持ちます。注意してコピペしてください。
  • app コンテナの設定と同じインデントレベルで貼り付けます。

docker/nginx/default.conf

  • ドキュメントルートを /work/public とする
  • index.php を起点とする
  • *.php へのアクセスは appコンテナへ
[mac] $ mkdir docker/nginx
[mac] $ touch docker/nginx/default.conf
default.conf
server {
    listen 80;
    root /work/public;
    index index.php;
    charset utf-8;

    location / {
        root /work/public;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

build & up

[mac] $ docker-compose down
[mac] $ docker-compose up -d --build
  • docker-compose コマンドは docker-compose.yml があるディレクトリで実行します。
[mac] $ docker-compose ps
            Name                          Command              State           Ports        
--------------------------------------------------------------------------------------------
docker-laravel-handson_app_1   docker-php-entrypoint php-fpm   Up      9000/tcp             
docker-laravel-handson_web_1   nginx -g daemon off;            Up      0.0.0.0:10080->80/tcp

docker-laravel-handson_web_1 コンテナの State が Up になっていたら正常に起動している状態です。

nginxのバージョン確認

[mac] $ docker-compose exec web nginx -v
nginx version: nginx/1.17.3

webコンテナの確認

  • webコンテナの動作確認
  • HTMLとPHPが表示されるか
[mac] $ mkdir src/public
[mac] $ echo "Hello World" > src/public/index.html
[mac] $ echo "<?php phpinfo();" > src/public/phpinfo.php

http://127.0.0.1:10080/index.html

「Hello World」が表示されることを確認する。

http://127.0.0.1:10080/phpinfo.php

phpinfoの情報が表示されることを確認する。

[mac] $ rm -rf src/*

確認用に作成したHTML, PHPファイルは不要なので削除します。

結果にコミット

[mac] $ git status
[mac] $ git add .
[mac] $ git status
[mac] $ git commit -m "feat create docker web container"
[mac] $ git log

Laravelをインストールする

  • app コンテナに入り、Laravelをインストール
  • welcomeページが表示されるか
[mac] $ docker-compose exec app ash
[app] $ composer create-project --prefer-dist "laravel/laravel=6.0.*" .
[app] $ php artisan -V
Laravel Framework 6.0.4

[app] $ exit

Laravel ウェルカム画面の表示

http://127.0.0.1:10080

LaravelのWelcome画面が表示されることを確認する。

結果にコミット

[mac] $ git status
[mac] $ git add .
[mac] $ git status
[mac] $ git commit -m "feat laravel install"
[mac] $ git log

データベース(db)コンテナを作る

MySQLデータベースコンテナを作成します。
MySQLのベースイメージをそのまま利用します。

参考記事

ディレクトリ構成

.
├── docker
│   └── mysql
│       └── my.cnf # MySQLの設定ファイル
├── docker-compose.yml
└── logs
    ├── mysql-error.log # MySQLエラーログ
    ├── mysql-query.log # MySQL通常クエリログ
    └── mysql-slow.log # MySQLスロークエリログ

docker-compose.yml

  • データベース名やユーザー名等の接続情報とタイムゾーンの設定は環境変数で渡す
  • トップレベルvolumeを使用してデータの永続化
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:

docker/mysql/my.cnf

[mac] $ mkdir docker/mysql
[mac] $ touch docker/mysql/my.cnf
my.cnf
[mysqld]
# character set / collation
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# MySQL8 caching_sha2_password to mysql_native_password
default-authentication-plugin = mysql_native_password

# Error Log
log-error = /var/log/mysql/mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

build & up

[mac] $ docker-compose down
[mac] $ docker-compose up -d --build
  • docker-compose コマンドは docker-compose.yml があるディレクトリで実行します。
[mac] $ docker-compose ps
            Name                          Command              State           Ports        
--------------------------------------------------------------------------------------------
docker-laravel-handson_app_1   docker-php-entrypoint php-fpm   Up      9000/tcp             
docker-laravel-handson_db_1    docker-entrypoint.sh mysqld     Up      3306/tcp, 33060/tcp  
docker-laravel-handson_web_1   nginx -g daemon off;            Up      0.0.0.0:10080->80/tcp

docker-laravel-handson_db_1 コンテナの State が Up になっていたら正常に起動している状態です。

[mac] $ docker-compose exec db mysql -V
mysql  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)

マイグレーション実行

[mac] $ docker-compose exec app ash
[app] $ php artisan migrate

Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)

[app] $ exit

結果にコミット

[mac] $ git status
[mac] $ git add .
[mac] $ git status
[mac] $ git commit -m "feat create docker db container"
[mac] $ git log

GitHubにpush

[mac] $ git push

リモートリポジトリへpushされていることを確認します。

Docker環境の再構築

Docker環境の破棄

コンテナの停止、ネットワーク・名前付きボリューム・コンテナイメージを削除

[mac] $ docker-compose down --volumes --rmi all

作業ディレクトリの削除

[mac] $ cd ..
[mac] $ rm -rf docker-laravel-handson

Visual Studio Code等のGUIエディタで開いている場合は、一度エディタを終了しましょう。

環境の再構築

GitHubからリポジトリをクローン

** 自身のリポジトリ先に適宜変更してください **

[mac] $ git clone git@github.com:ucan-lab/docker-laravel-handson.git
[mac] $ cd docker-laravel-handson
[mac] $ docker-compose up -d --build

http://127.0.0.1:10080

/work/public/../vendor/autoload.php を開くのに失敗してエラーになっていることを確認します。
git cloneが終わった状態では app コンテナ内に /work/vendor ディレクトリが存在しないためです。

Laravelインストール

app コンテナに入ります。

[mac] $ docker-compose exec app ash

vendor ディレクトリへライブラリ群をインストールします。
composer.lock ファイルを参照します。

[app] $ composer install

composer install 時は .env 環境変数ファイルは作成されないので、 .env.example を元にコピーして作成します。

[app] $ cp .env.example .env

スクリーンショット 2019-09-29 2.10.51.png

.envAPP_KEY= の値がないとこのエラーが発生します。
このコマンドでアプリケーションキーを生成できます。

[app] $ php artisan key:generate

Welcome画面が表示されることを確認します。

[app] $ php artisan migrate

最後にマイグレーションを実行して成功すればハンズオン終了です。
お疲れ様でした🙌🙌 コンテナを停止して終了してください。

[app] $ exit
[mac] $ docker-compose down

オマケ

MySQLに接続したい

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

mysql> show tables;
+---------------------+
| Tables_in_homestead |
+---------------------+
| migrations          |
| password_resets     |
| users               |
+---------------------+
3 rows in set (0.00 sec)

mysql> desc users;
+-------------------+---------------------+------+-----+---------+----------------+
| Field             | Type                | Null | Key | Default | Extra          |
+-------------------+---------------------+------+-----+---------+----------------+
| id                | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name              | varchar(255)        | NO   |     | NULL    |                |
| email             | varchar(255)        | NO   | UNI | NULL    |                |
| email_verified_at | timestamp           | YES  |     | NULL    |                |
| password          | varchar(255)        | NO   |     | NULL    |                |
| remember_token    | varchar(100)        | YES  |     | NULL    |                |
| created_at        | timestamp           | YES  |     | NULL    |                |
| updated_at        | timestamp           | YES  |     | NULL    |                |
+-------------------+---------------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)

マイグレーションが実行されるとLaravel側で最初から用意されている users, password_resets のテーブルが生成されています。

各種ログを見たい

php, nginx, mysqlのログはこちらに出力されます。

$ ls -l ./logs
total 26720
-rw-r--r--  1 ucan  staff      1618  7 18 20:47 access.log
-rw-r--r--  1 ucan  staff       558  7 18 20:47 error.log
-rw-r-----  1 ucan  staff      2937  7 18 20:30 mysql-error.log
-rw-r-----  1 ucan  staff  12888506  7 18 20:30 mysql-query.log
-rw-r-----  1 ucan  staff       534  7 18 20:30 mysql-slow.log
-rw-r--r--  1 ucan  staff       360  7 18 20:30 php-error.log

Laravelのログはこちらに出力されます。

$ ls -l ./src/storage/logs
total 104
-rw-r--r--  1 ucan  staff  49969  7 14 20:47 laravel-2019-07-18.log

コンテナのログを見る。

$ docker-compose logs
# -f でログウォッチ
$ docker-compose logs -f
# サービス名を指定してログを表示
$ docker-compose logs -f app

MySQLクライアントツールで接続したい

docker-compose.ymldb サービスに下記設定を追記して、コンテナを再起動して設定を反映してください。

    ports:
      - 13306:3306

dbコンテナへのポート転送設定がないとホストからアクセスが行えません。
以降の設定はこちらの記事「MySQLクライアントGUIツールで接続」を参考に接続してください。

Windowsエラーメモ

Error response from daemon

$ docker-compose up -d --build
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

解決策をいくつか

マイグレーションエラーの補足

Host '172.27.0.2' is not allowed to connect to this MySQL server

$ php artisan migrate
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1130] Host '172.27.0.2' is not allowed to connect to this MySQL server (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')

  at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [1130] Host '172.27.0.2' is not allowed to connect to this MySQL server")
      /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=db;port=3306;dbname=homestead", "homestead", "secret", [])
      /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

このエラーが発生した場合は my.cnf を作成する前に docker-compose up -d でビルドしてしまった可能性が高いです。

$ docker-compose down --volumes --rmi all
$ docker-compose up -d --build

設定ファイルがない状態でMySQLの初期化が行われたでデータが永続化されてしまってるので一度ボリューム毎削除してビルドし直せばokです。

docker volumes の共有で Permission denied (SELinux) 問題

CentOS 等の場合 volumes でホストと共有したファイル(ディレクトリ)にアクセスできないことがあります。

selinuxラベルを変更する

  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql:z
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:z

ホスト側のSELinuxを無効化しても良いかもです。
CentOS7 SELinuxを無効化/有効化する

書き込み権限を与える

$ chmod -R 777 logs
$ chmod -R 777 src/storage/logs

ログディレクトリはホスト側からもコンテナ側からも書き込みするので、書き込み権限を付与しておきましょう。

応用

より実用的な構成のdocker構成の記事を書いてますので、よかったらこちらの記事も読んでもらえると嬉しいです。

ucan-lab
Backend Developer at ROLO. I love PHP and I'm focusing on Laravel, Docker, GraphQL.
https://u-can.pro
miraito-inc
システムデザインを中心に置いた開発により高品質で使いやすいシステムを提供いたします。業務システム構築、アプリ開発、コンサルティングまで幅広く手がけています。
https://miraito-inc.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした