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 명령을 실행하면(자), 일어나지 않았다 (그대로 사용되게 한다고 생각했는데…)
  • 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
    

  • 앱 컨테이너가 일어나고 있습니다.

    환경


  • 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에서 테이블을 만들고 컨테이너를 일단 삭제해도 데이터는 남아있었습니다!

    좋은 웹페이지 즐겨찾기