-
Notifications
You must be signed in to change notification settings - Fork 0
Docker Compose로 데이터베이스 자동화 구성하기
데이터베이스에 데이터 변경 할 때마다 추가/삭제를 수동으로 하는 과정이 번거럽고 상당한 시간을 소유하는 문제가 있습니다.
Docker Compose를 활용해서 데이터베이스를 자동으로 삭제/추가를 할 수 있도록 구성했습니다.
Docker Compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 묶어 관리를 용의하게 할 수 있는 작업 환경 도구 입니다.
MariaDB 데이터베이스를 Docker 단일 컨테이너만 사용해서 구축이 가능합니다. 그렇지만 커맨드라인에 Docker 환경 설정 내용을 한 눈에 보기가 어렵습니다.
docker-compose.yml
파일에서는 Docker 환경 설정 명령어는 yml 파일로 문서화 할 수 있다는 점에서 Docker Compose 파일을 만들어 사용하게 되었습니다.
docker-compose.yml 작성하기
version: '3.1'
services:
database:
image: mariadb:11.2.2
container_name: book-store-compose
restart: always
ports:
- 3307:3306
env_file:
- ./server/.env
volumes:
- ./data/conf.d:/etc/mysql/conf.d
- ./data/data:/var/lib/mysql
- ./server/resources/init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
TZ: Asia/Seoul
command: --init-file /docker-entrypoint-initdb.d/init.sql
환경 구성은 다음과 같습니다.
- 데이터베이스 MariaDB 11 버전
- Docker Container : books-store-compose
- 매번 재실행
- Docker 포트는 3306, 외부 접근 포트는 3307
- MariaDB 설정 파일은
.env
에 설정 - volumes:
-
/server/resources/init.sql
에 SQL Script 파일을/docker-entrypoint-initdb.d/init.sql
에 저장
-
- environment
- 타임존 : Asia/Seoul
-
--init-file /docker-entrypoint-initdb.d/init.sql
command 실행
Docker 이미지가 구축 될 때 자동으로 데이터가 주입이 됩니다.
init.sql
스트립트 파일에 데이터는 다음과 같습니다.
use BookStore;
-- set Foreign key = 0
set FOREIGN_KEY_CHECKS = 0;
-- truncate tables
TRUNCATE BookStore.books;
TRUNCATE BookStore.category;
TRUNCATE BookStore.likes;
TRUNCATE BookStore.users;
-- insert Data
INSERT INTO BookStore.category (name) VALUES ('소설');
INSERT INTO BookStore.category (name) VALUES ('컴퓨터/IT');
INSERT INTO BookStore.category (name) VALUES ('자기계발');
INSERT INTO BookStore.category (name) VALUES ('기술/공학');
INSERT INTO BookStore.category (name) VALUES ('시/에세이');
INSERT INTO BookStore.category (name) VALUES ('인문');
INSERT INTO BookStore.category (name) VALUES ('가정/육아');
INSERT INTO BookStore.category (name) VALUES ('요리');
INSERT INTO BookStore.category (name) VALUES ('건강');
INSERT INTO BookStore.category (name) VALUES ('취미/실용/스포츠');
INSERT INTO BookStore.category (name) VALUES ('정치/사회');
INSERT INTO BookStore.category (name) VALUES ('역사 문화');
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("어린왕자들", 7, 1, "종이책", 0, "어리다....", "많이 어리다...", "김어림", 100, "목차", 20000, 3 , "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("신델렐라", 2, 2, "종이책", 1, "유리구두...", "투명한 유리구두", "걍구두", 100, "목차", 20000, 10, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("백설공주들", 10, 3, "종이책", 2, "사과...", "많이 어리다...", "김어림", 100, "목차", 20000, 15, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("흥부와 놀부", 20, 4, "종이책", 3, "제비...", "많이 어리다...", "김어림", 100, "목차", 20000, 20, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("콩쥐 팥쥐", 4, 1, "ebook", 4, "콩팥..", "콩심은데 콩나고..", "김콩팥", 100, "목차입니다.", 20000, 5, "2024-01-07");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("용궁에 간 토끼", 5, 1, "종이책", 5, "깡충..", "용왕님 하이..", "김거북", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("해님달님", 15, 2, "ebook", 6, "동앗줄..", "황금 동앗줄..!", "김해님", 100, "목차입니다.", 20000, 5, "2024-01-16");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("장화홍련전", 80, 1, "ebook", 7, "기억이 안나요..", "장화와 홍련이?..", "김장화", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("견우와 직녀", 8, 2, "ebook", 8, "오작교!!", "칠월 칠석!!", "김다리", 100, "목차입니다.", 20000, 5, "2024-01-01");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("효녀 심청", 12, 1, "종이책", 9, "심청아..", "공양미 삼백석..", "김심청", 100, "목차입니다.", 20000, 5, "2024-01-12");
INSERT INTO BookStore.books (title, img_id, category_id, form, isbn, summary, detail, author, pages, contents, price, likes, pub_date)
VALUES ("혹부리 영감", 22, 2, "ebook", 10, "노래 주머니..", "혹 두개 되버림..", "김영감", 100, "목차입니다.", 20000, 5, "2024-01-05");
INSERT INTO BookStore.users (email, name, password, salt) VALUES ('[email protected]', '홍길동', 'DXG6vjL/j7wfMA==', 'y9gFwrBaPpH7FQ==');
INSERT INTO BookStore.users (email, name, password, salt) VALUES ('[email protected]', '이홍철', '7Gzc43UTFzogzA==', 'I+0dnN1aFMFdDA==');
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 1);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (2, 2);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 3);
-- set Foreign key = 1
set FOREIGN_KEY_CHECKS = 1;
Docker Compose가 실행이 되면 Docker 이미지 파일이 생성이 됩니다.
Docker 이미지 생성 시 SQL 파일이 자동으로 데이터를 주입합니다.
SQL 파일에 데이터를 주입 하기 전에 데이터베이스를 먼저 선택을 해야합니다.
외래키(FK
) 맺은 테이블은 데이터 주입이 자동으로 되지 않기 때문에 set FOREIGN_KEY_CHECKS = 0;
외래키 설정을 꺼야 합니다.
외래키(FK
)가 꺼진 후에 데이터 주입이 가능합니다.
TRUNCATE <TableName>
로 데이터 베이스 테이블를 초기화 합니다.
기존에 있던 데이터를 지워야 새로운 데이터 주입이 가능합니다.
각 테이블에 데이터가 초기화 되면 데이터를 주입합니다.
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 1);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (2, 2);
INSERT INTO BookStore.likes (user_id, liked_book_id) VALUES (1, 3);
모든 데이터가 주입이 완료가 되면 마지막에 외래키 맺은 설정(set FOREIGN_KEY_CHECKS = 1
)을 다시 켜줍니다.
이 과정이 완료가 되면 데이터베이스 새로운 데이터를 주입 할 수 있습니다.
Node 환경에서 npm Script에 명령어를 작성합니다.
"scripts": {
"docker:up": "docker-compose up -d",
"docker:down": "docker-compose down",
},
docker-compose up -d
명령어는 Docker 컨테이너를 생성하는 명령어입니다. 새로 시작 할 때 이 명령어를 사용하면 됩니다.
docker-compose down
명령어는 Docker 컨테이너를 삭제하는 명려어입니다.
두 명령어는 npm Script에 작성합니다.
npm run docker:up
, npm run docker:down
두 명령어만 입력하면 자동생성, 삭제가 가능합니다.
운영 환경에서는 이 과정을 하면 안됩니다.
로컬 환경에서 테스트용으로 사용해야 됩니다.