Edited at

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


概要

docker(docker-compose)でLEMP環境(PHP7.3/nginx1.17/MySQL8.0/Laravel5.8)を構築し、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: 5.8


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をインストール1(公式サイト)


[Mac]Docker for Macをインストール2(HomeBrew)

brew caskを利用している方はこちら

[mac] $ brew cask install docker


Docker for Mac を起動する

[mac] $ open -a Docker

メニューバーの🐳のアイコンのアニメーションが止まって running 状態になればok


[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


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



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


  • 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

COMPOSE_PROJECT_NAME=docker-laravel-handson

DB_NAME=homestead
DB_USER=homestead
DB_PASS=secret
TZ=Asia/Tokyo


  • COMPOSE_PROJECT_NAME コンテナ名を指定できるCLI環境変数


    • http://docs.docker.jp/compose/reference/envvars.html

    • 他プロジェクトとコンテナ名は被ってはいけない

    • コンテナ名は docker-compose ps で確認できる

    • docker-laravel-handson_app_1

    • なし: ディレクトリ名 + _ + サービス名 + _ 連番

    • あり: COMPOSE_PROJECT_NAME + _ + サービス名 + _ + 連番

    • 複数プロジェクトを作るときに任意のコンテナ名を指定できるので便利です



  • データベースの接続情報とタイムゾーンを環境変数として設定


アプリケーションサーバ(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

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

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

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



  • docker-compose exec 実行中のコンテナ内で、コマンドを実行します。


  • app サービス名(コンテナ名)を指定します。


  • ash appコンテナ内でashシェルを実行します。


    • Almquist Shell(アルムクィストシェル)

    • 環境変数PATH等は ~/.profile 設定する



[app] $ exit

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


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=5.8.*" .
[app] $ php artisan -V
Laravel Framework 5.8.32

[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

[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

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

.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.16
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構成の記事を書いてますので、よかったらこちらの記事も読んでもらえると嬉しいです。