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

備忘録です。

# 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`コマンドを実行したら、立ち上がらなかった（そのままで使いまわせると思ったのに…）

```bash
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の中身

```yaml: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の古いデータを削除します

```bash
# MySQLの以前のデータを削除する
rm -rf docker/db/mysql_data
```

- Dockerの不要なイメージ、コンテナ、ネットワーク、ボリュームを削除します

```bash
# Docker コンテナの停止・削除
docker-compose down

# Docker の不要なイメージ、コンテナ、ネットワーク、ボリュームを削除する
docker system prune
```

- MySQLのデータのローカルのディレクトリ（`./docker/db/mysql_data`）への同期をやめるために、 `docker-compose.yml` の下記の行を削除します

```yaml

db:
  volumes:
    - ./docker/db/mysql_data:/var/lib/mysql # ← この行を削除
```

- MySQLのデータを、ボリュームで永続化する(コンテナ削除してもデータは残す)ために、 `docker-compose.yml` に下記の行を追加します（mysql_dataという名前のボリュームを作成）

```yaml

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:　 # ← この行を追記
```

- イメージから作成し直します

```bash
# 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: