[Docker] 도커의 MySQL 컨테이너 셋팅을 해보자

·2023년 1월 27일
0

Docker

목록 보기
5/5

🐋 Docker의 MySQL 컨테이너의 문제


Docker를 이용해서 MySQL 컨테이너를 띄우면 MySQL을 사용할 수 있지만 여기에 문제가 하나 있다.
바로 MySQL의 Characterset설정이 utf8mb4 이 아니라는 것이다.

이게 왜 문제일까?
위의 이미지처럼 utf8mb4이 아닌 latin1의 문제는 바로 한국어를 담을 시 MySQL에서 글이 깨진다는 것이다.
이는 데이터를 저장함에 있어서 아주 큰 문제가 있기에 이를 설정해서 깨지지 않도록 하는 것이 중요하다.

별도로 설정을 하지 않았을 경우의 도커 셋팅


# docker-compose.yaml

services:
  mysql:
    platform: linux/x86_64
    image: mysql:latest
    container_name: mysql
    environment:
      MYSQL_DATABASE: 'abcd'
      MYSQL_ROOT_PASSWORD: '1234'
    ports:
      - 23306:3306

MySQL 컨테이너에 별도로 설정하지 않았다면 위와 비슷한 형태일 것이다.
바로 Volume과 Command가 없고, utf8mb4 설정 또한 하지 않아서, 생성 시 latin1이 자동으로 설정된다.
이를 어떻게 변경해야 한글을 깨지지 않게 할 수 있을까?

🔜 도커의 컨테이너를 이렇게 변경해보자


우선 Dockerfile을 이용해 MySQL 컨테이너의 기초를 만들어준다. 이때 중요한 부분은 Volumes를 이용해 셋팅 파일을 도커 내부로 옮겨주는 것이다.

Command를 사용하는 방법도 있지만 나의 경우 제대로 적용이 되지 않아 Volume을 이용한 방법을 선호하고 있다.

우선 이런 파일을 하나 만든다.

# my.cnf

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set = utf8mb4

[mysqld]
init_connect = "SET collation_connection = utf8_general_ci"
init-connect = 'SET NAMES utf8'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake

이 파일이 MySQL 초기셋팅을 위한 설정 파일이다. 보면 MySQL의 Database를 만들때 utf8mb4로 설정한다는 설정 내용이 담겨져있다.

그리고 위의 파일을 사용하기 위해 Dockerfile을 만들어준다.

# mysql.Dockerfile

FROM mysql:latest      # mysql버전

COPY my.cnf /etc/mysql/conf.d/          # conf : mysql의 charset설정 파일
COPY initdb.sql /docker-entrypoint-initdb.d/      # initdb.sql : docker로 mysql실행 시 실행할 내용 파일

그리고 컨테이너에 이 mysql.Dockerfile을 사용해서 빌드하는 것이다!

변경된 MySQL 도커 컨테이너


# docker-compose.yaml

mysql:
    build:
      context: /home/ubuntu/${경로}
      dockerfile: ./mysql.Dockerfile                # 위의 도커 파일을 토대로 mysql이미지를 생성.
    container_name: mysql
    environment:
      MYSQL_DATABASE: 'abcd'
      MYSQL_ROOT_PASSWORD: '1234'
    volumes:
      - ./my.conf:/etc/mysql/my.cnf                # mysql charset설정 파일을 컨테이너로 옮긴다.
    ports:
      - 23306:3306

Dockerfile에 mysql의 charset 설정을 정의한 cnf 파일을 copy하도록 했으니 생성 시에 설정이 되고, 이 이미지를 컨테이너 생성시에 사용하기에 문제없이 utf8 설정이 이루어 진다.

volumes: 를 기준으로 로컬에 없고 docker container에 있는 파일이면 로컬로 가져오고,
로컬에만 있고 도커 내에 없으면 도커 내로 가져가는 양방향 통신이다.

profile
뉴비는 문서화를 습관화 해보자

0개의 댓글