
1. 계기
다른 업체들간 데이터 연계를 위해 DB를 만들어야할 일이 생겼다. PostgresDB가 익숙하지만, 업체의 요청에 따라 MariaDB로 만들게 되었다. 그 과정을 공유해보고자 한다. 사실 도커로 DB 생성하는것은 굉장히 간한단 일이지만, api를 통해 데이터 input을 지원해야 해서 글거리가 생긴 것 같다. 이 글에서는 Docker 및 docker-compose로 MariaDB를 생성하고, 추후 Express.js API서버와 연동한다.
2. 도커 기반 Maria DB 생성
2-1. Dockerfile 작성
MariaDB를 사용하기 위해 Dockerfile을 작성한다. 버전의 제약은 별도로 없으므로 최신버전(latest)를 사용하였다.
# Dockerfile
FROM mariadb:latest
COPY init.sql /docker-entrypoint-initdb.d/
EXPOSE 3306
FROM에 사용할 도커 이미지를 작성한다. 이미지:버전
의 형태로 작성하면 된다. 여기선 최신버전으로 latest를 사용했지만, 특정 버전을 원한다면 적어주면 된다.
COPY는 도커 컨테이너 생성 시 복사할 파일을 의미한다. 이게 무슨 말이냐면, 로컬에서 설정파일을 만들어 두고 해당 명령어를 통해 도커 컨테이너 내부에서 적용되게끔 한다. 일종의 마운트 개념으로 이해하면 된다.
EXPOSE는 DB에서 사용할 포트번호를 작성한다. 참고로 MariaDB의 기본 포트는 3306이다.
2-2. docker-compose.yml 작성
# docker-compose.yml
version: '3.8'
services:
mariadb:
image: dbdbdeep_db
build: .
environment:
MARIADB_ROOT_PASSWORD: dbdbdeep01@
MARIADB_DATABASE: 데이터베이스명
MARIADB_USER: 유저명
MARIADB_PASSWORD: 패스워드
TZ: 'Asia/Seoul'
ports:
- '3306:3306'
volumes:
- db_data:/var/lib/mysql
networks:
- dbdbdeep_net
volumes:
db_data:
networks:
dbdbdeep_net:
external: true
위와같이 필요한값을 채워서 만들면 된다. 특이사항은 networks
를 사용하였는데, 추후 express api를 같은 대역에서 사용하기 위해 적용하였다. 그리고 datetime 통일을 위해 타임존을 한국시간대로 설정하였다. 어차피 DB에서는 datetime을 ISO표준으로 사용할 예정이기 때문에 값을 신경쓰지 않아도 된다는 장점이 있다.
이게 무슨말이냐면, DB에 저장되는 값은 UTC기준으로 설정이 된다. 그리고 DB의 값을 읽어올 때 해당 시간대로 적용이 된다는 의미이다. 예를 들어 저장된 시간이 00:00 이라면(HH:MM), 한국에서 서비스 되는 곳이라면 읽었을 때 09:00 (Asia/Seoul +09:00)이 적용된다는 뜻이다.
volumes의 db_data 경로를 도커 컨테이너 내부의 /var/lib/mysql에 마운트 하였다. 이것은 DB의 데이터가 저장될 경로를 의미하며, 이를 통해 데이터의 영속성을 보장할 수 있다.
2-3. 설정파일
-- init.sql
CREATE DATABASE IF NOT EXISTS 데이터베이스명;
USE 데이터베이스명;
CREATE TABLE `테이블명` (
`ID` varchar(1000) NOT NULL COMMENT 'id',
`NAME` varchar(200) NOT NULL COMMENT '이름',
`CREATE_DATE` datetime NOT NULL COMMENT '생성일'
);
GRANT ALL PRIVILEGES ON 데이터베이스명.* TO '유저명'@'%' IDENTIFIED BY '패스워드';
FLUSH PRIVILEGES;
Dockerfile에서 설정파일로 마운트한 init.db의 내용이다. DB를 생성하기 위한 스크립트에 해당하는데, 위 스크립트는 간단한 예시로 만들었다.
필요에 따라 올바른 테이블과 컬럼을 구성한다.
실행
작업 경로에서 docker compose up -d
명령을 통해 도커 컨테이너를 구동하면 된다.