성장 과정/인사이트
Docker Compose에서 MySQL 데이터 영속성 설정하기
택트
2025. 5. 23. 05:23
🐳 도커 컴포즈
최신 버전에서는 Docker Desktop이 기본적으로 Docker Compose v2를 포함하고 있어서 별도로 설치할 필요 없이 사용할 수 있다.
과거에는 도커 컴포즈가 별도 바이너리로 취급되어 직접 설치하는 과정이 요구되었으며, dokcer-compose 명령어를 사용했다.
# 설치 확인
docker compose version
# 출력 예시
Docker Compose version v2.34.0-desktop.1
docker-compose.yml # 기본 공통 구성
docker-compose.override.yml # 로컬 전용 설정 (자동 인식)
docker-compose.prod.yml # 운영 환경 전용
.env # 환경변수
데이터 영속성 설정하기
개발하다 보면 MySQL을 도커로 띄우는 경우가 많은데, 컨테이너를 껐다 켜니 데이터가 날아간 경험이 한 번쯤 있을 것이다. 데이터를 안전하게 보존하기 위해 데이터 영속성을 설정하자.
더보기
도커 컨테이너는 일회성이다.
컨테이너를 닫으면 컨테이너는 사라지게 되는데, 이때 볼륨을 지정하지 않았다면 MySQL 데이터도 전부 사라지게 된다. 그래서 MySQL 데이터를 따로 디스크에 저장하도록 설정해 주는 것을 '영속성 설정'이라고 표현하겠다.
version: '3.8' # 버전 생략 권장
services:
<서비스 이름(보통 db)>:
image: mysql:latest
container_name: <컨테이너 이름>
restart: always
environment:
MYSQL_ROOT_PASSWORD: <루트 비밀번호>
MYSQL_DATABASE: <데이터베이스 이름>
MYSQL_USER: <사용자 이름>
MYSQL_PASSWORD: <사용자 비밀번호>
ports:
- "3306:3306"
위 예시에서는 MySQL을 최신 버전으로 설정하였으나, 단순 학습 목적이 아닌 실제 개발 환경에서는 재현성 보장을 위해 특정 버전을 지정하는 것을 권장한다. (보안 업데이트나 마이너 버전 업데이트 나오면 직접 올려서 테스트하고 반영하는 방식)
컨테이너 이름에는 하이픈을 사용하고, 그 외 데이터베이스 이름 같은 것에는 언더스코어를 사용한다. 사실 언더스코어로 전부 통일해도 되지만, 컨테이너 이름 같은 건 셸에서 직접 타이핑할 일이 있기 때문에 하이픈이 더 자연스럽기 때문이다.
(Ex. docker run --name hospital-db)
볼륨을 설정하는 방법은 두 가지다. 도커 볼륨을 사용하거나, 호스트 디렉토리 매핑을 하는 것이다.
1. 도커 볼륨 사용 (권장)
services:
db:
image: mysql:latest
...
volumes:
- db_data:/var/lib/mysql
volumes:
db_data: # 도커 볼륨 선언
db_data라는 도커 볼륨이 생성되고, 그 안에 MySQL의 모든 DB 파일이 저장된다. 도커가 자동으로 관리하며, 설정이 간편하다. 단, 로컬에서 직접 보기엔 조금 불편할 수 있다.
2. 호스트 디렉토리 매핑 (편한 로컬 확인/디버깅)
services:
db:
image: mysql:latest
...
volumes:
- ./mysql-data:/var/lib/mysql
현재 프로젝트 폴더에 mysql-data 디렉토리가 생기고, 그 안에 실제 DB 파일들이 저장된다. 직접 DB 파일을 보기 수월하지만, 특히 리눅스 환경에서 디렉토리 권한 문제가 생길 수 있다. (chmod, chown 같은 권한 이슈)
/var/lib/mysql은 실제로 MySQL이 DB 파일을 저장하는 경로다. 따라서 이 경로를 마운트하여 데이터 영속성을 확보하는 것이다.
결국 실제 개발 환경, 협업 상황에서는 안정성 및 이식성을 위해 도커 볼륨을 사용하고, 학습 목적으로 보기 편하고 싶다면 호스트 디렉토리 매핑도 나쁘지 않은 선택일 수 있다.
기타 팁
# 컨테이너 이름 지정 (가독성)
container_name: mysql-container
# 초기 SQL 스크립트 실행
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
.init.sql에 원하는 테이블 생성 쿼리를 넣어두면, 최초 실행 시 자동 적용된다.
# 실행 명령어
docker compose up -d
docker-compose는 과거 방식이니 최신 명령어를 사용하자.