ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0. MySQL 8.0 Docker Compose 환경 구축
    SQL/MySQL 2021. 11. 26. 10:44

    0. Introduction

    최근 최신 버전의 MySQL을 다운받아 사용해야 할 일이 있었습니다. 편의를 위해 docker를 통해 환경을 구축하였고, 이후에 참고하기 위해 블로그에 정리한 내용입니다. 저도 docker에 대해선 아직 많이 부족하여 자세한 설명은 어려울 것 같고, 대부분의 내용은 이 포스트를 보고 작성하였습니다. Docker가 설치되어있다는 가정하에 진행하도록 하겠습니다.

     

     

    1. MySQL 8 이미지 다운받기

    docker pull mysql:8

     

     

    2. Container와 연결할 폴더 만들기

    원하는 곳에 새로운 폴더를 만듭니다.

     

     

    3. Docker Compose 작성하기

    • "container_name": 원하는 컨테이너명
    • "image": 도커 이미지(앞서 다운받은 mysql:8)
    • "volumes": 컨테이너 안의 환경과 연결할 로컬 디렉토리
    • "ports": 원하는 포트 번호(MySQL deafult:3306)
    • "env_file": 비밀번호 등의 정보 담은 외부 파일명
    더보기

    "volumes" 추가 설명

     

    docker-compose를 내리는 순간 모든 데이터가 초기화 됩니다. 이를 방지하기 위해서는 로컬에 따로 연결하여 저장을 해두어야 합니다. 위의 3가지는 MySQL이 기본적으로 필요로 하는 필수적인 디렉토리들입니다.

     

    마지막 1가지는 선택사항 입니다. MySQL 상에서 데이터를 export 하는 것은 '/var/lib/mysql' 하에 저장하는 것이 권장되지만 편의를 위해 따로 './data'를 생성하였습니다.

    # /docker-compose.yml
    
    version: '3'
    
    services:
        db:
        	container_name: mysql8
            image: mysql:8
            restart: always
            volumes:
                - "./db/conf.d:/etc/mysql/conf.d"
                - "./db/data:/var/lib/mysql"
                - "./db/initdb.d:/docker-entrypoint-initdb.d"
                - "./data:/data"
            ports:
                - 3306:3306
            env_file: .env
            environment:
                TZ: Asia/Seoul

     

     

    4. MySQL 설정 파일 작성하기

    현재 "secure-file-priv=NULL"이 기본값입니다. 이렇게 되면 외부로 csv를 추출하는 것이 불가능하므로 미리 "secure-file-priv="""으로 설정하여 어디에든 저장할 수 있게 하였습니다. 

    # /db/conf.d/my.cnf
    
    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server           = utf8mb4
    collation-server               = utf8mb4_unicode_ci
    secure-file-priv               = ""
    더보기
    secure-file-priv 세팅을 안해주면 아래와 같은 에러를 만날 수 있습니다.

    Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement.

     

    더보기
    Docker안에 my.cnf 파일 즉, 기본 MySQL 세팅 파일이 존재하는데 위와 같이 로컬에서 미리 파일을 작성하고 연결을 하면 덮어 씌워져서 새로 작성한 my.cnf 내용으로 반영이 됩니다.

     

     

    5. ".env" 파일 작성하기

    # /.env
    MYSQL_HOST = localhost
    MYSQL_PORT = 3306
    MYSQL_ROOT_PASSWORD = password

     

     

    6. 최종 구조 확인

    최종적으로 다음과 같은 구조를 갖게 됩니다.

     

     

    7. docker-compose up으로 컨테이너 띄우기

    "docker-compose.yml"이 위치한 곳에서 아래의 코드를 실행합니다.

    '-d' 는 데몬으로 실행하라는 명령어이고 생략하게 되면 터미널에 로그가 쌓이게 됩니다.

    # /
    docker-compose up -d

    실행하면 다음과 같이 나옵니다.

    터미널에 "mysql_ex(container_name) ... done"이라고 나오면 성공입니다. 왼쪽 디렉터리를 보면 새로운 파일들이 많이 추가된 것이 보이는데, 이는 MySQL 자체적으로 필요한 파일들로 도커와 로컬이 잘 연결된 것을 확인할 수 있습니다.

     

     

    8. Container 접속

    아래의 명령어를 통해 컨테이너에 접속할 수 있습니다.

    docker exec -it {container_name} bash

    {container_name}에 설정한 컨테이너명 혹은 아이디를 넣으면 됩니다.

    "docker ps"를 통해 컨테이너명 및 아이디를 확인할 수 있습니다.

     

     

    9. mysql 접속

    mysql -u root -p
    password

     

     

    10. DB 생성

    CREATE DATABASE practice;
    USE practice;

     

     

    11. Table 생성

    DROP TABLE IF EXISTS review;
    CREATE TABLE review (
        user_id    varchar(255)
      , product_id varchar(255)
      , score      numeric
    );
    
    INSERT INTO review
    VALUES
        ('U001', 'A001', 4.0)
      , ('U001', 'A002', 5.0)
      , ('U001', 'A003', 5.0)
      , ('U002', 'A001', 3.0)
      , ('U002', 'A002', 3.0)
      , ('U002', 'A003', 4.0)
      , ('U003', 'A001', 5.0)
      , ('U003', 'A002', 4.0)
      , ('U003', 'A003', 4.0)
    ;

     

     

    12. csv로 추출

    SELECT 'user_id', 'product_id', 'score'
    
    UNION ALL
    
    SELECT
        *
    FROM
        review
    INTO OUTFILE '/data/example.csv'
    CHARACTER SET euckr
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    ;

    '/v8/data/example.csv'를 확인하면 csv 파일로 잘 추출된 것을 확인할 수 있습니다.

     

     

    참고자료

    https://int-i.github.io/sql/2020-12-31/mysql-docker-compose/

Designed by Tistory.