
부트캠프에서 배웠던 내용 중에 새롭게 프로젝트를 세팅할 때 docker-compose 를 사용해서 데이터베이스 구성을 설정하는 방법을 알게되었습니다. 덕분에 올해 개발했던 스프링 프로젝트들에 docker-compose를 통해 데이터베이스 환경을 쉽고 편하게 관리하고 개발할 수 있었습니다.
이번 포스팅에서는 docker-compose로 mysql과 redis 데이터베이스 환경을 구성하여 로컬 개발 시 부담을 덜 수 있는 좋은 방법을 소개해드리려 합니다. 😄
잠깐! docker-compose가 뭐지?
방법을 소개드리기 전에 간단하게 docker-compose에 대해 간략하게 설명해드리겠습니다.
(공식 문서 링크에서도 참고해보실 수 있습니다.)
docker-compose는 하나의 프로젝트에서 사용하는 여러 docker 컨테이너를 하나로 묶어주는 스크립트형 관리 도구입니다. 보통 yaml이라는 환경설정용 스크립트 파일로 작성됩니다. 단일 프로젝트에서는 여러 컨테이너를 관리하는 일이 없을 것입니다. 하지만 프로젝트가 커지고, 여러 모듈과 프로그램들을 사용하다보면 여러 컨테이너를 사용할 일이 발생하기도 하죠. 그 때 사용하는 도구가 바로 docker-compose입니다. docker-compose를 사용하면 다음과 같은 장점이 있습니다.
- 스크립트를 작성해놓기만 한다면 실행 커맨드 한 번으로 컨테이너 묶음을 실행할 수 있습니다.
- 개발 중인 프로젝트와 격리된 환경에서 프로그램을 다룰 수 있습니다. (= 의존성이 분리됩니다.)
- 반대로 생각하면 한 프로그램을 프로젝트별로 분리하여 관리할 수도 있게 됩니다.
사실 docker 컨테이너를 만드는 dockerfile과 함께 사용하여 활용을 해야 제대로 docker-compose를 활용할 수 있다고 볼 수 있습니다. 하지만 저는 이미 만들어져 있는 이미지들(데이터베이스 이미지들)을 묶어 사용하는 용도로써 사용하려 합니다.
docker를 docker-compose를 사용하는 것이 처음에는 당연히 번거로울 수 있습니다. 하지만 로컬에서 여러 프로젝트를 개발할 때 각 프로젝트에서 환경이 따로 분리가 되기에 익숙해지기만 한다면 보다 더 나은 개발 환경을 구축할 수 있을 것입니다! 👍
mysql docker-compose 스크립트
아래는 제가 사용하는 mysql docker-compose 스크립트입니다. (파일명 docker-compose.yaml)
# docker-compose.yaml
version: '3'
services:
mysql:
container_name: app-mysql
image: mysql:8.0
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: 'true'
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
TZ: Asia/Seoul
volumes:
- ${MYSQL_VOLUME_PATH}:/var/lib/mysql
ports:
- ${MYSQL_PORT}:3306
위 스크립트의 environment 부분은 mysql 문서의 environment variables 부분을 참고했습니다.
위 스크립트에서는 달러 표시($)와 함께 영어 대문자로 표기된 친구들이 값으로 설정되어 있습니다. 왜 값을 직접 넣지 않았을까요? 그 이유는 민감 정보가 될 수 있는 부분, 또는 같은 값을 공유하는 부분을 환경변수로 처리했기 때문입니다. docker-compose는 환경변수 파일(.env 파일)의 환경변수를 통해 값을 전달받을 수 있습니다. (자세한 내용은 도커 공식홈페이지 환경변수 설명 링크를 참고해주세요)
물론 환경변수들을 지우고 직접 적어주셔도 무방합니다. 필자는 민감정보가 될 수 있다고 생각하는 부분은 꼭 .env파일을 통해 관리해주는 것이 좋다고 생각하기 때문에 환경변수를 이용하는 것을 권장하는 바입니다.
mysql .env 스크립트
docker-compose.yaml 파일과 같은 경로에 다음 스크립트 파일을 넣어주시면 됩니다.
# .env
# MYSQL 설정
MYSQL_USER=user # 주의! root로 설정하면 안됩니다.
MYSQL_PASSWORD=password1234
MYSQL_VOLUME_PATH=./bin/mysql
MYSQL_URL=localhost
MYSQL_PORT=3306
MYSQL_DATABASE=db-domain
각 환경변수들에 대해 설명을 덧붙이자면 다음과 같습니다.
MYSQL_USER:MYSQL_DATABASE에 작성된 데이터베이스의 super user가 될 사용자 이름입니다. root 유저와 달리 따로 생성되는 계정이기 때문에 root를 적으면 에러가 나며 실행이 되지 않을 것입니다. 유저를 따로 생성하게 되면 외부에서 데이터베이스를 접근할 때 root보다 접근 범위가 좁기 때문에 보안 측면에서 더 우위를 점할 수 있습니다.MYSQL_PASSWORD:MYSQL_USER의 패스워드입니다. 데이터베이스마다 기본 설정이 다르겠지만 설정해놓는 것이 좋겠죠?MYSQL_VOLUME_PATH: 컨테이너에서 DB 파일들을 로컬 컴퓨터에 저장(마운트)해놓는 경로입니다. 해당 경로를 설정해놓으면 컨테이너가 어떠한 잘못으로 삭제가 되어도 해당 경로를 지정하여 컨테이너를 다시 설정하면 저장해놓았던 상태로 복구가 가능합니다.MYSQL_URL: 컨테이너에 접속할 수 있는 IP 주소입니다. localhost가 기본 설정입니다.MYSQL_PORT: 기본 포트입니다. mysql은 기본으로 3306을 사용하고 있기 때문에 3306을 적어놓았습니다.MYSQL_DATABASE: 컨테이너에서 사용할 데이터베이스의 이름입니다. 이 데이터베이스 아래에 테이블들이 저장됩니다.
redis docker-compose 스크립트
마찬가지로 레디스도 docker-compose를 통해 관리할 수 있습니다. 제가 알기로 레디스는 윈도우 환경에서는 특정 버전 이후로 지원이 중단된 것으로 알고 있습니다. 그래서 윈도우 환경에서는 WSL을 이용하여 레디스를 설치하고 관리해야하는데, 이게 여간 귀찮은 일이 아닐 수 없습니다. 그래서 겸사겸사 docker-compose를 이용하니 편리했습니다!
# docker-compose.yaml
version: '3'
services:
redis:
container_name: app-redis
image: redis:7.2
command: redis-server --port 6379
volumes:
- ${REDIS_VOLUME_PATH}:/data
ports:
- ${REDIS_PORT}:6379
REDIS_VOLUME_PATH와 REDIS_PORT는 위 mysql의 환경변수 부분과 동일하기 때문에 생략하도록 하겠습니다. 마찬가지로 env 파일에 다음과 같이 적어주시면 됩니다.
# .env
# Redis 설정
REDIS_VOLUME_PATH=./bin/redis
REDIS_HOST=localhost
REDIS_PORT=6379
최종 docker-compose.yml 파일과 .env 파일
최종적으로 두 설정을 합친 파일의 내용은 다음과 같습니다.
# Docker Compose
version: '3'
services:
mysql:
container_name: app-mysql
image: mysql:8.0
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_RANDOM_ROOT_PASSWORD: 'true'
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
TZ: Asia/Seoul
volumes:
- ${MYSQL_VOLUME_PATH}:/var/lib/mysql
ports:
- ${MYSQL_PORT}:3306
redis:
container_name: app-redis
image: redis:7.2
command: redis-server --port 6379
volumes:
- ${REDIS_VOLUME_PATH}:/data
ports:
- ${REDIS_PORT}:6379
# .env 파일
# MYSQL 설정
MYSQL_USER=user # 주의! root로 설정하면 안됩니다.
MYSQL_PASSWORD=password1234
MYSQL_VOLUME_PATH=./bin/mysql
MYSQL_URL=localhost
MYSQL_PORT=3306
MYSQL_DATABASE=db-domain
# Redis 설정
REDIS_VOLUME_PATH=./bin/redis
REDIS_HOST=localhost
REDIS_PORT=6379
참고
- docker-compose 공식 문서 (https://docs.docker.com/compose/)