LoginSignup
7
8

More than 3 years have passed since last update.

MySQLの入ったdbコンテナが立ち上がらない!〜Dockerイメージ、docker-compose.ymlを別の開発環境で中身を変えずに使いまわそうとして〜

Posted at

備忘録です。

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の基礎をごりっと学習して、下記の対策にようやくたどり着きました…:sob:

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でテーブルを作成して、コンテナを一旦削除してみても、データは残ったままでした!:blush:

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8