프로젝트 도중에 팀원이 테스트 때문에 넣어뒀던 데이터가 다 사라진 상황이 있었다.
나는 혼자 도커 볼륨을 사용하고 있어 그런 문제가 없었고, 이 상황에서 내 개발 환경뿐만 아니라 모든 팀원의 개발 환경이 같다면 이러한 문제를 해결할 수 있다고 생각했다.
또한 운영체제가 달라서 생길 수 있는 잠재적인 문제 또한 해결하기 위해 도커 컴포즈 스크립트를 작성하기로 했다.
Docker Compose 선택
도커 컴포즈를 선택한 이유는 다음과 같다.
1. 통일된 환경 보장
각자 다른 운영체제를 사용하더라도 동일한 환경에서 개발 가능하고 로컬 설치로 인한 버전 차이나 설정 차이 문제 해결할 수 있다.
2. 간편함과 편의성
단순히 개인의 컴퓨터에서 docker-compose up -d 명령어만 입력하면 모든 서비스가 실행되어 새로운 팀원이 합류해도 빠르게 개발환경이 구축된다.
3. 데이터 보장
이미 위에서 한 번 언급했듯이 볼륨 설정을 한 번에 해두어 컨테이너가 종료되거나 의도치 않게 컨테이너가 사라져도 데이터는 보장된다.
프로젝트 구성
현재 프로젝트에서는 다음 세 개의 데이터베이스를 사용하고 있다.
Redis(캐시 서버), MariaDB(메인 DB), MongoDB(비정형 데이터를 위한 DB)
위 세 개의 데이터베이스를 개인이 각각 로컬에서 설치하는 것보다 Docker Compose로 통합 관리하는 것이 더 효율적이다.
Docker Compose 스크립트
Redis 설정
cache-server:
image: redis:latest
container_name: redis
ports:
- 6379:6379
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
restart: unless-stopped
포트는 기본 포트(6379)를 사용했고, 컨테이너가 종료되어도 데이터가 유지되도록 redis-data 볼륨을 구성했습니다.
또한 redis-cli ping 명령어를 통해 Redis 서비스 상태를 확인하도록 했습니다.
5초마다 헬스체크를 실행하며, 3초 안에 응답이 없으면 실패로 판단하고, 최대 10번까지 재시도하도록 설정했습니다.
MariaDB 설정
db:
image: mariadb:latest
container_name: mariadb
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=thiscoding
- MYSQL_ROOT_PASSWORD=1234
volumes:
- mariadb-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
환경변수를 설정해 초기 DB 이름과 루트 비밀번호를 설정했습니다.
로컬 환경이 아니라면 꼭 환경변수 파일을 통해 설정해야한다.
MongoDB 설정
mongodb:
image: mongo:latest
container_name: mongodb
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=1234
- MONGO_INITDB_DATABASE=thiscoding-mongodb
volumes:
- mongodb-data:/data/db
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 10s
retries: 5
restart: unless-stopped
설명 생략
services:
cache-server:
image: redis:latest
container_name: redis
ports:
- 6379:6379
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
restart: unless-stopped
db:
image: mariadb:latest
container_name: mariadb
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=thiscoding
- MYSQL_ROOT_PASSWORD=1234
volumes:
- mariadb-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
mongodb:
image: mongo:latest
container_name: mongodb
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=1234
- MONGO_INITDB_DATABASE=thiscoding-mongodb
volumes:
- mongodb-data:/data/db
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 10s
retries: 5
restart: unless-stopped
volumes:
redis-data:
mariadb-data:
mongodb-data:
주요 설정 내용
헬스체크
모든 서비스에 헬스체크를 설정해서 서비스가 정상적으로 실행되고 있는지 확인하도록 했습니다.
이를 통해 서비스 시작 순서를 관리했고, 장애 발생 시 빠르게 감지하여 재시도하도록 했습니다.
볼륨관리
각 데이터베이스별로 별도의 볼륨을 생성하여 데이터의 영속성을 보장했고, 컨테이너 재실행 or 재생성 시에도 데이터를 유지할 수 있게 하였습니다.
마무리
도커 컴포즈 적용으로 모든 팀원이 통일된 개발환경에서 개발할 수 있었습니다.
나의 경우에도 도커에서 각각의 컨테이너를 따로 켜줘야 됐던 불편함을 명령어 한줄로 세 개의 컨테이너를 바로 실행할 수 있게되었습니다.
또한 노트북이 아닌 데스크탑으로 개발할 때도 빠르게 개발환경 구축이 가능했다.
'개발' 카테고리의 다른 글
| Querydsl 서브쿼리 중복 코드 개선 - 의존성 분리 (2) | 2025.08.11 |
|---|---|
| 통계 데이터 비동기로 관리하기 (2) | 2025.08.01 |
| Redis 캐시 구조 개선 : Redis Hash 적용하기 (1) | 2025.06.24 |
| MongoDB 도큐먼트 분리와 Redis 캐싱으로 게시판 성능 최적화 (2) | 2025.05.26 |
| Redis 캐싱 직렬화 실패 해결 과정 (LocalDateTime 대응) (2) | 2025.05.06 |