Database
Mac M1 docker mysql 설치 및 실행( + 한글 설정 )
구티맨
2022. 2. 17. 22:15
목차
M1 용으로 도커를 다시 설치하게 되어, 기존 컨테이너들이 사라지게되어 MySQL을 다시 설치하게 되었습니다.
MySQL을 설치하고 한글 인코딩 설정하는 방법을 알아보도록 하겠습니다.
1. MySQL 이미지 다운로드 및 컨테이너 실행
docker pull을 해보면 에러가 발생합니다. --platform 으로 플랫폼을 명시해주면 정상적으로 mysql 이미지를 받을 수 있습니다.
➜ ~ docker pull mysql:8.0.28
8.0.28: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
➜ ~ docker pull --platform linux/amd64 mysql:8.0.28
MySQL 컨테이너를 생성&실행 할 때도 플랫폼을 명시해줍니다.
➜ ~ docker run --platform linux/amd64 --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.28
2. MySQL 한글 설정
아래와 같이 컨테이너의 bash를 수행해 mysql에 접속하여 database를 만듭니다.
➜ ~ docker exec -it mysql bash
➜ ~ mysql -uroot -p1234
mysql> CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
한글 데이터를 넣고 확인해보면, ???? 로 데이터가 표시되는 것을 확인할 수 있습니다.
character_set을 확인해보면, latin1 값으로 되어 있습니다.
이걸 utf8로 변경해줘야 한글 데이터가 정상적으로 표현이 됩니다.
mysql> show variables like 'c%';
+----------------------------------------------+--------------------------------+
| Variable_name | Value |
+----------------------------------------------+--------------------------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_digest_rounds | 5000 |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb3 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
| check_proxy_users | OFF |
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8mb4_0900_ai_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| connection_memory_chunk_size | 8912 |
| connection_memory_limit | 18446744073709551615 |
| core_file | OFF |
| create_admin_listener_thread | OFF |
| cte_max_recursion_depth | 1000 |
+----------------------------------------------+--------------------------------+
아래와 같이 my.cnf 파일을 열어줍니다.( vi가 설치되어 있지 않은 경우에는, 컨테이너 vi설치 글을 참조하여 설치합니다. )
$ docker exec -it mariadb bash
root@74c163276af6:/# cd /etc/mysql
root@74c163276af6:/etc/mysql# vi my.cnf
my.cnf에서 아래 내용을 추가하여 저장합니다.
[client]
default-character-set = utf8
[mysqld]
init_connect = "SET collation_connection = utf8_general_ci"
init_connect = "SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
[mysql]
default-character-set = utf8
다시 인코딩 정보를 확인해보면, latin1으로 되어있던 것들이 utf8로 변경된 것을 확인할 수 있습니다.
mysql> show variables like 'c%';
+----------------------------------------------+--------------------------------+
| Variable_name | Value |
+----------------------------------------------+--------------------------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_digest_rounds | 5000 |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb3 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
| check_proxy_users | OFF |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| connection_memory_chunk_size | 8912 |
| connection_memory_limit | 18446744073709551615 |
| core_file | OFF |
| create_admin_listener_thread | OFF |
| cte_max_recursion_depth | 1000 |
+----------------------------------------------+--------------------------------+
이제 MySQL 컨테이너를 재시작하고 데이터를 조회하면 한글이 정상적으로 나오는 것을 확인 할 수 있습니다.
docker stop mariadb
docker start mariadb