개발

docker-compose 로 개발 환경의 DB 구축하기

모달조아 2023. 4. 22. 19:12

개요

개인 프로젝트이고 자신만 그 코드를 실행시킨다면 굳이 docker 를 이용할 필요가 없다. 어차피 같은 환경에서만 실행할 것이니깐. 하지만, 여러 사람이 다루게 된다면 여러 환경에서 코드가 실행되어지게 되고 이때 docker 를 이용하면 구축하려는 것이 여러 환경에서 동일함이 보장되니 참 편하다.

다만, 개인 프로젝트라 하더라도 docker 로 환경을 구축하고, 여러 컨테이너들을 실행할 떄마다 매번 명령어들을 적어줘야하는  상당히 귀찮다. 순서를 틀리거나, 빼먹을 위험도 있다. 이런 불편함을 docker-compose 를 이용하면 쉽게 해결할 수 있다.


docker-compose.yml 속성들 알아보기

docker-compose.yml 파일은 앞서 말했던 명령어들을 적어놓은 스크립트라고 보면 된다.

나는 개발 환경에서 사용할 DB 를 구축하기 위해 아래와 같이 작성하였다.

version: '3'
services:
  db:
    image: mysql:8.0.32
    ports:
      - "3306:3306"
    env_file:
      - ../env/docker-compose.env
    container_name: seat-view
    environment:
      TZ: Asia/Seoul
    volumes:
      - seat-view:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    restart: always

volumes:
  seat-view:

위에서 부터 하나씩 속성들을 알아보자.

 

  • version
    • docker-compose 버전을 작성한다. '3' 이라고 적으면 3 버전의 제일 최신 버전을 사용한다는 의미이다. 버전마다 지원하는 옵션이 다르니 공식 문서를 참고해보자.

 

  • services
    • docker 에 구축하고 싶은 컨테이너를 docker-compose 에서는 service 라고 지칭한다. 나는 개발 환경에서의 DB 를 구축하고자 하였기에 db 라고 이름을 정해주었다. 이름은 자신이 원하는 것으로 지정해주면 된다.

 

  • image
    • 컨테이너에 사용할 도커 이미지를 작성한다. 나는 dockerhub 의 공식 mysql 이미지를 사용하였다.

 

  • ports
    • 컨테이너가 어떤 포트를 사용할 지 지정해준다.

 

  • env_file
    • 각 service 에 필요한 환경 변수를 env 로 관리해야하는 경우가 있다. 해당하는 env 파일을 적어주면 된다.

 

  • container_name
    • 컨테이너 이름을 지정한다.

 

  • environment
    • 환경 변수를 지정해주는 곳이다.

 

  • TZ
    • TZ 속성은 타임존 설정에 관한 것이다. Asia/Seoul 로 지정해주었다.

 

  • volumes
    • 데이터를 저장할 곳을 지정해준다. 컨테이너 내부의 독립적인 공간을 이용할 수도 있지만, 컨테이너가 종료되거나 컨테이너가 삭제되었을 경우에 데이터가 삭제된다. 다른 방법으로는 바인드 마운트라고 호스트의 디렉토리와 직접 연결하는 방법이 있다. 다만 호스트의 파일 시스템과 직접적으로 연결되므로 호스트의 디렉토리 구조에 의존적이게 된다. 그러므로 volume 을 하나 새롭게 만들어주고 거기다가 저장하도록 설정하였다.
    • volume 은 도커 엔진 내의 가상의 디스크라고 생각하면 이해하기 편하다. 엄밀히 말하자면 도커가 관리하는 호스트의 파일 시스템 영역에 저장된다. 하지만 도커에 의해서 관리되고 호스트 파일 시스템과는 독립적이다. 그러므로 도커 내의 가상의 디스크라고 이해하는 것이 나는 개인적으로 편했다.
    • seat-view 라는 볼륨을 만들어주고 컨테이너 내부 /var/lib/mysql 디렉토리의 데이터를 마운트하도록 하였다. 참고로, 도커를 통해 실행한 mysql 컨테이너는 기본적으로 컨테이너 내부의 /var/lib/mysql 에 데이터들을 저장한다.
      • 즉, seat-view 볼륨은 도커 호스트의 특정 경로와 연결되고, 컨테이너 내부 /var/lib/mysql 은 seat-view 볼륨과 마운트되었으니 도커 호스트에 저장된 데이터와 연결된 것이다. 그렇기에 컨테이너가 삭제되어도 데이터는 사라지지 않는다.

 

  • docker-entrypoint-initdb.d
    • DDL 을 미리 작성해놓고, DB 생성 시 그것을 바탕으로 스키마를 만들고 싶을 수 있다. 그럴 때, 이 설정을 이욯하면 된다.
    • 컨테이너의 /docker-entrypoint-initdb.d/ 디렉토리에 .sql 파일이나 .sh 파일이 있으면 그것을 실행한다.
    • ./init.sql:/docker-entrypoint-initdb.d/init.sql -> 이렇게 작성하였다. 의미는 docker-compose.yml 이 있는 디렉토리의 init.sql 파일을 컨테이너 내의 /docker-entrypoint-initdb.d/init.sql 로 마운트하겠다는 의미이다.

 

  • restart
    • always 는 컨테이너를 수동으로 끄기 전까지 자동으로 재시작하겠다는 의미이다. 이외에도 수동으로 재시작하겠다는 no 옵션, 오류가 있을 시에 재시작하겠다는 on-failure 옵션이 있다.

마무리

docker-compose.yml 을 구성하는 속성은 글에 언급한 것 이외에도 여러가지 속성들이 있다. 추가적인 옵션들은 docker docs 를 참고하면 쉽게 이해하고 이용할 수 있다.