개발 환경 통일을 위한 Docker Compose 도입

프로젝트 도중에 팀원이 테스트 때문에 넣어뒀던 데이터가 다 사라진 상황이 있었다.

나는 혼자 도커 볼륨을 사용하고 있어 그런 문제가 없었고, 이 상황에서 내 개발 환경뿐만 아니라 모든 팀원의 개발 환경이 같다면 이러한 문제를 해결할 수 있다고 생각했다.

또한 운영체제가 달라서 생길 수 있는 잠재적인 문제 또한 해결하기 위해 도커 컴포즈 스크립트를 작성하기로 했다.

 

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 재생성 시에도 데이터를 유지할 수 있게 하였습니다.

 

마무리

도커 컴포즈 적용으로 모든 팀원이 통일된 개발환경에서 개발할 수 있었습니다.

나의 경우에도 도커에서 각각의 컨테이너를 따로 켜줘야 됐던 불편함을 명령어 한줄로 세 개의 컨테이너를 바로 실행할 수 있게되었습니다.

또한 노트북이 아닌 데스크탑으로 개발할 때도 빠르게 개발환경 구축이 가능했다.