안녕하세요, 힐링페이퍼에서 백엔드를 담당하고 있는 제이슨입니다!

사용자가 불편함 없이 빠르고 안정적으로 더 좋은 의료 서비스를 이용할 수 있도록 하는 역할을 하고 있습니다.

저번에 Flyway 로 Java 에서 DB schema, seed 관리하기 라는 글을 적었었는데요. Flyway 를 사용한 여러 목적 중 local 개발 환경 설정을 쉽게 하고 싶다는 부분이 있었죠.

이번에는 이어서 Docker Compose 로 local 개발 환경을 편하게 설정하는 방법을 다루고자 합니다. 이 글은 Docker 를 알지만 Docker Compose 는 잘 모르는 분, 혹은 Docker Compose 를 알지만 local 환경 관리에 사용하지 않아본 분들을 대상으로 작성되었습니다.

Why Docker?

"local 환경을 설정하는데 왜 Docker 를 사용해야하지? 그거 배포할 때 쓰고 그러는 거 아니야?"

신입 제이손 군은 프로젝트 A 에 배정 받으며 local 환경을 세팅하게 되었습니다. local 환경은 prod 환경과 최대한 동일해야 혹시나 모를 해당 버전의 특성이나 버그 등을 미리 알거나 재현할 수 있기 때문에, prod 환경에서 사용하는 MySQL 5.7.27 을 Homebrew 를 통해 local 환경에도 똑같이 설치하고 뿌듯해하고 있었습니다.

그러다가 프로젝트 B 도 잠깐 봐줄 일이 생겼네요. 앗, 프로젝트 B 는 MySQL 5.6.50 을 사용하고 있어요. 그래도 Homebrew 로 여러 버전을 설치해 번갈아가며 쓸 수 있다는 사실에 안도하고, MySQL 5.6.50 도 설치해서 필요할 때마다 왔다갔다 했습니다.

아 친구들과 사이드 프로젝트 C 를 하기로 했는데 MySQL 8.0.22 로 하자고 하네요. 이제 슬슬 MySQL 버전 바꾸는 것에 지치기 시작했어요. 😥

이럴 때 Docker 를 사용하면 문제를 쉽게 해결할 수 있습니다. 프로젝트마다 MySQL 이 다른 port 를 사용하도록 하면 다 띄워 놓는다고 하더라도 상관이 없으니까요.

$ docker run --name <name> -e MYSQL_ROOT_PASSWORD=<password> -d -p <port>:3306 mysql:<version>
자비로운 Docker 고래가 여러분을 local 환경에서도 평온하게 해드릴 것입니다

Why Docker Compose?

"그래 Docker 를 local 환경 설정에도 사용하면 편하다는 것은 알겠어. 그런데 Docker Compose 는 또 뭐야?"

Docker 와 평온한 나날을 보내고 있던 제이손은 프로젝트 A 에서 cache 를 위해 Redis 를 사용해야겠다는 생각이 들었습니다. Docker 와 함께라면 이제 local 환경 설정은 두렵지 않아요.

그런데 이제 timescale DB 가 필요해져서 InfluxDB 도 사용해야겠네요. 슬슬 프로젝트를 변경하면서 작업할 때마다 Docker container 를 하나하나 띄우고 내리는 것이 귀찮아질 것 같은 느낌이에요.

같이 일하는 팀원들한테도 InfluxDB 를 추가한다고 알려야겠네요. 어떻게 Docker 로 띄워야 하는지는 제가 알려줘야해요.

이 문제도 Docker Compose 를 사용하면 쉽게 해결할 수 있습니다!

Docker Compose 는 간단하게 여러 Docker application 들을 어떻게 실행할지 정의하고 실행할 수 있는 툴입니다. 먼저 예제부터 보시죠.

# docker-compose.yml

version: '3'

services:
  database:
    image: mysql:5.7.27
    ports:
      - 43306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
    command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
	redis:
    image: redis:5.0.5
    ports:
      - 46379:6379
  influxdb:
    image: influxdb
    ports:
      - 48086:8086

MySQL, Redis, InfluxDB 각각의 Docker 설정들을 모두 docker-compose.yml 파일에 작성해두었습니다.

이제 아래 명령어를 실행하면 해당 Docker container 들을 띄워줍니다.

# -d 는 detach 모드로 Docker container 들을 background 에서 돌리도록 합니다.
$ docker-compose up -d
Starting master_database_1 ... done
Starting master_redis_1    ... done
Starting master_influxdb_1 ... done

이렇게 local 환경 관리에 Docker Compose 를 이용했을 때 어떤 장점들이 있을까요?

  • 띄우고 내리는 등의 행위가 편하다
  • Docker 환경이 파일로 관리된다
  • 협업 하는 모두가 명령어 하나로 쉽게 같은 환경을 사용할 수 있게된다

Docker Compose 는 이뿐만이 아니더라도 Docker container 간 dependency 를 정의해서 순서대로 띄워준다든지 등의 유용한 기능들을 많이 가지고 있습니다. 자세한 내용은 문서를 참고해주세요!

마무리

저는 local 환경에서 완벽하게 개발하는 것을 매우 추구합니다. 환경을 prod 환경과 최대한 일치시키고, client 없이 test code 만으로 검증해서 배포하는 것이죠.

이런 작업 방식에 있어 Docker Compose 가 없으면 얼마나 귀찮은 일이 많을지 상상만 해도 끔찍하네요. 😖 여러분들도 Docker Compose 로 평온을 얻으시면 좋겠습니다.

Reference

https://docs.docker.com/compose/

Json
Server Developer
사용자가 빠르고 안정적으로 강남언니를 이용하실 수 있게 Back-end 를 담당하고 있습니다. 생각하는 개발자입니다.