0. MySQL 8.0 Docker Compose 환경 구축
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 = ""
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement.
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/