備忘録です。
1.やりたいこと
docker-compose up
コマンドでMySQLの入ったdbコンテナを立ち上げたい。
2.課題
dbコンテナでエラーが発生し、立ち上がらない。
状況
- 学習サービスで配布のDockerイメージ、docker-compose.ymlを、別の開発環境でも使いまわそうとした
- Dockerコンテナは、ApacheとPHPの入ったappコンテナと、MySQLの入ったdbコンテナ
- docker-compose.yml は何も中身をいじらず
docker-compose up -d
コマンドを実行したら、立ち上がらなかった(そのままで使いまわせると思ったのに…)
portfolio $ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------
portfolio_app_1 docker-php-entrypoint apac ... Up 0.0.0.0:50080->80/tcp
portfolio_db_1 docker-entrypoint.sh mysqld Exit 1
- appコンテナは立ち上がってる
環境
- MacOS 10.14.6
- Docker Desktop for mac
- dbコンテナ(MySQL:5.5.62)
- appコンテナ(php:7.4-apache)
参考:docker-compose.ymlの中身
docker-compose.yml
version: "3"
services:
app:
build:
context: .
dockerfile: docker/app/Dockerfile
ports:
- "50080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mysql:5.5.62
ports:
- "53306:3306"
volumes:
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/mysql_data:/var/lib/mysql
env_file:
- ./docker/db/db-variables.env
ログを確認すると下記が出力されている。
エラーログ
201123 21:20:26 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
201123 21:20:26 [Note] mysqld (mysqld 5.5.62) starting as process 1 ...
201123 21:20:26 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
201123 21:20:26 [Note] Plugin 'FEDERATED' is disabled.
201123 21:20:26 InnoDB: The InnoDB memory heap is disabled
201123 21:20:26 InnoDB: Mutexes and rw_locks use GCC atomic builtins
201123 21:20:26 InnoDB: Compressed tables use zlib 1.2.11
201123 21:20:26 InnoDB: Using Linux native AIO
201123 21:20:26 InnoDB: Initializing buffer pool, size = 128.0M
201123 21:20:26 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile1 is of different size 0 0 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
201123 21:20:26 [ERROR] Plugin 'InnoDB' init function returned error.
201123 21:20:26 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
201123 21:20:26 [ERROR] Unknown/unsupported storage engine: InnoDB
201123 21:20:26 [ERROR] Aborting
201123 21:20:26 [Note] mysqld: Shutdown complete
「ログファイル ./ib_logfile1 は .cnf ファイルで指定されたサイズ 0 5242880 バイトとは異なる 0 0 バイト」なのが、問題らしく、InnoDBとやらが立ち上がらず、MySQLもシャットダウンする様子。
最初はローカルのディレクトリの ib_logfile1 のサイズの設定などで真っ向勝負して時間を投下しましたが、初学者には手強すぎて、Dockerの基礎をごりっと学習して、下記の対策にようやくたどり着きました…
3.最終的に効果のあった対策
ローカルのディレクトリ./docker/db/mysql_data
に同期する構成から、Dockerのボリュームを作成してそこに保存する構成に変更しました。
- MySQLの古いデータを削除します
# MySQLの以前のデータを削除する
rm -rf docker/db/mysql_data
- Dockerの不要なイメージ、コンテナ、ネットワーク、ボリュームを削除します
# Docker コンテナの停止・削除
docker-compose down
# Docker の不要なイメージ、コンテナ、ネットワーク、ボリュームを削除する
docker system prune
- MySQLのデータのローカルのディレクトリ(
./docker/db/mysql_data
)への同期をやめるために、docker-compose.yml
の下記の行を削除します
db:
volumes:
- ./docker/db/mysql_data:/var/lib/mysql # ← この行を削除
- MySQLのデータを、ボリュームで永続化する(コンテナ削除してもデータは残す)ために、
docker-compose.yml
に下記の行を追加します(mysql_dataという名前のボリュームを作成)
db:
image: mysql:5.5.62
ports:
- "53306:3306"
volumes:
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- mysql_data:/var/lib/mysql # ← この行を追記
env_file:
- ./docker/db/db-variables.env
volumes: # ← この行を追記
mysql_data: # ← この行を追記
- イメージから作成し直します
# Docker イメージのビルド
docker-compose build
# Docker コンテナの起動
docker-compose up -d
# コンテナの起動状態を確認する
docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
portfolio_app_1 docker-php-entrypoint apac ... Up 0.0.0.0:50080->80/tcp
portfolio_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:53306->3306/tcp
立ち上がった!
MySQLでテーブルを作成して、コンテナを一旦削除してみても、データは残ったままでした!