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을 사용해서 빌드하는 것이다!
# 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에 있는 파일이면 로컬로 가져오고,
로컬에만 있고 도커 내에 없으면 도커 내로 가져가는 양방향 통신이다.