티스토리 뷰

 

 

 

 

※ 3줄 요약

도커 컨테이너는 독립적인 개발환경 구축에 편의성을 제공합니다.
도커를 통해 프로젝트 개발 환경 공유가 간편합니다.
도커 짱짱맨!! 도커 씁시다 여러분.

 

1. 배경설명

최근 지인의 권유로 사이드프로젝트에 참여하게 됐습니다. 과거 주가 데이터를 이용해 특정 조건으로 주식을 거래했을 때 얼마의 수익이 났는지 계산해 주는 프로젝트로, Spring boot+JDBCtemplate와 Flutter로 개발 중이었습니다. 개인적으로 주식 관련 도메인이 신선해 보였고, Flutter를 사용한다기에 신기술도 접해볼 수 있다고 생각했습니다. 추가적으로 JDBCtemplate을 Spring Data JPA와 QueryDSL을 이용해 리팩토링 해보는 것도 재밌을 것 같아 프로젝트에 합류하기로 결정했습니다.

개발환경 분석 중 Mysql을 로컬환경에서 사용하고 있어  팀원 간에 개발환경 공유가 어려웠었습니다. 다행이도 최근 Docker 강좌를 듣게 되어, 프로젝트에도 적용해 보면 좋을 것 같아 도커를 이용해 보기로 결정했습니다.

 

 

 

2. 도커 컨테이너 환경 구축

1) dockerfile vs docker-compose.yml

우선 프로젝트에서 필요한 조건을 간단히 표로 정리해보았습니다. 

 

프로젝트 요구사항
  • 데이터베이스와 WAS 등과 같은 아키텍처 구성은 팀원 모두 동일한 환경이 구성되어야합니다.
  • 별도 서버를 가지고 있지 않기에 각 로컬 환경에서 개발환경을 구축해야합니다.
  • 서비스를 위한 초기 데이터가 데이터베이스에 초기화 되어있어야합니다

 

 

 

 

위와 같은 요구사항을 기반을 dockerfile과 docker compose 차이점을 비교해 보았고, 이에 대한 적절한 설명이  dockerlabs에 있어 가져와 봤습니다.

Difference between Docker Compose Vs Dockerfile

A Dockerfile is a simple text file that contains the commands a user could call to assemble an image whereas Docker Compose is a tool for defining and running multi-container Docker applications.

Docker Compose define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment. It gets an app running in one command by just running docker-compose up. Docker compose uses the Dockerfile if you add the build command to your project’s docker-compose.yml. Your Docker workflow should be to build a suitable Dockerfile for each image you wish to create, then use compose to assemble the images using the build command.

 

  • Dockerfile : 이미지를 조합을 위한 유저 요청 명령어를 포함한 단순한 텍스트 파일
  • Docker Compose : 다양한 컨테이너 도커 어플리케이션 실행과 정의를 위한 도구
    • docker-compose.yml 안에 애플리케이션 구성을 위한 서비스를 정의할 수 있고, 분리된(=독립적인) 환경에서 함께 실행할 수 있습니다.
    • docker-compose up 한번의 명령어로  애플리케이션을 실행할 수 있습니다.
    • 도커의 워크플로우는 각 생성하고자 하는 이미지에 알맞은 도커파일을 빌드한 다음, compose 빌드 명령어를 사용하여 이미지를 조합을 구성합니다.

 

 

단순 이미지가 필요한 경우 Dockerfile을 사용
복잡하고 여러 이미지의  세부적인 구성이 필요하다면 Docker compose 사용


위의 요구사항과 Dockerfile 과 Docker Compose 용도를 기반으로, 최종적으로 Docker Compose로 구현하기로 결정했고 선택한 이유 또한 표로 정리해 보았습니다.

 

Docker Compose 선택 이유
  •  yaml 작성되어 configuration 가독성이 좋습니다.

  • 컨테이너가 생성되고 Mysql 이미지를 실행되면서 local 환경과 컨테이너 볼륨을 마운트 시킬 수 있어,
    초기 데이터를 초기화시킬 수 있습니다.

  • 팀원 간에 docker-compose.yml 파일만 공유받으면 서로 동일환 환경에서 개발을 수행할 수 있습니다.

  • 추후 Webserver와 WAS, redis와 같은 아키텍처를 추가할 예정이므로,
    docker-compose.yml 파일 안에 한번에 정의할 수 있습니다.

 

 

 

2) 컨테이너 생성 시 DB 초기화

docker-compose.yml 을 설정하면서  mysql 이미지를 불러와 애플리케이션 실행을 위한 초기데이터를 일괄 초기화를 위해 여러 방법을 찾아보던 중 로컬 PC 특정 디렉터리와 컨테이너 volume에 초기화 db를 마운트 시키는 방법을 알게 되었습니다. 이를 위해 로컬 DB에서 스키마와 데이터 sql문을 export 후 프로젝트에 mysql 폴더를 생성 후 위치시켰습니다. 

 

 

 

 

 

다음 docker-compose.yml 에 마운트 시키는 configuration을 추가해 주었습니다.

 

 

다음 docker-compose up -d 명령어를 이용해 compose를 백그라운드로 실행해주고

 

 

컨테이너에서 마운트 한 sql 파일이 있는지 확인 후

 

 

컨테이너 로그에 sql문이 실행되었는지 확인하고

 

 

최종적으로 DBeaver를 이용해 DB에 데이터가 초기화되었는지 확인했습니다.

 

 

 

3) Spring boot DB 설정

스프링부트 프로젝트에서 DB 접근을 위한 설정으로 application.yml을 사용했고 설정은 다음과 같습니다.

spring:
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/${DB 이름}?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8
        username: ${DB ID}
        password: ${DB PASSWORD}

 

 

위와 같은 설정을 마치고, IDE를 이용해 애플리케이션을 이용하면 정상적으로 서비스가 구동되는 것을 확인할 수 있습니다.

 

 

3. 느낀 점

- Docker로 개발환경을 변경하면서 개발 환경 간 의존성을 낮춰 추후 개발환경 변화에도 얼마든지 대처가능하다고 생각합니다.
- 향후 새로운 팀원이 합류했을 때 개발환경 구축 시간을 단축할 수 있을 거라 생각합니다.
- 도커 짱짱맨!

 

 

이상 정리 끝!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함