Docker를 사용하면 쉽게 환경을 구축할 수 있습니다. 로컬 테스트 환경을 구축하기 위해 매번 새로운 환경을 PC에 설치하는 대신에, Docker를 이용해서 가상 컨테이너를 사용합니다. 이 글에서는 Spring Boot 웹 어플리케이션에서 사용하는 전형적인 구성을 Docker-compose를 통해서 구성하는 법에 대해서 다룹니다.
이 글에 사용된 설정을 이용하면 Spring Boot + PostgreSQL + Redis 환경을 구축할 수 있습니다.
Spring Boot로 만든 웹 어플리케이션을 공유하려고 합니다. 그런데, Spring Boot 는 무척 배포하기 쉬운 것이 특징인데도 다른 사람이 해당 프로젝트를 실행하는 것은 쉽지 않습니다.
대부분의 경우, 데이터베이스를 같이 구성해야 하기 때문입니다.
임베디드 H2 Database 를 같이 사용할 수 있습니다. 하지만 데이터베이스 환경이 완벽히 일치하는 것은 아니고, Database에 특화된 기능을 사용할 경우 호환성을 장담하기 어렵습니다.
Docker를 이용해서 환경을 구성합니다.
다음이 설치 되어있어야 합니다.
Docker의 설치에 대해서는 다루지 않습니다. 다음 문서를 참고하세요.
편의상, 프로젝트 루트에 작성합니다.
touch ./Dockerfile
vi Dockerfile
#Dockerfile
# 사용하고자 하는 도커 이미지를 적습니다. jdk17을 사용하기 위해 amazoncorretto:17을 사용합니다.
FROM amazoncorretto:17
WORKDIR /app
COPY . /app
RUN chmod +x ./gradlew
# gradlew의 권한 문제를 해결하기 위해 chmod를 진행합니다.
RUN ./gradlew build -x test
# 테스트에 필요한 Database가 없으므로 테스트를 제외합니다.
# 테스트를 포함하고 싶다면, Spring 프로필을 통해서 테스트 전용 환경을 추가합니다.
CMD ["java", "-jar", "-Dspring.profiles.active=prod", "build/libs/app.jar"]
# 실행시킬 때 프로필을 명시할 수 있습니다.
touch ./docker-compose.yml
vi docker-compose.yml
# docker-compose의 버전을 명시합니다.
version: '3'
services:
# 필요한 콘테이너를 원하는만큼 구성합니다.
# 여기서는 Database를 위한 PostgreSQL과 캐시용 Redis를 구성하기로 합니다.
# PostgreSQL
db:
image: "postgres:latest"
restart: unless-stopped
# 재시작 옵션입니다.
hostname: "db"
# 호스트네임을 명시하지 않으면 콘테이너명과 동일한 값을 지닙니다.
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: dontpostyourpasswordonyourblog
# 환경변수를 사용할 수 있습니다.
ports:
- "5432:5432"
# 개방할 포트를 설정해줍니다.
# Redis
redis:
image: "redis:latest"
hostname: "redis"
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
# 원한다면 파일을 컨테이너 외부와 연결할 수 있습니다.
restart: unless-stopped
ports:
- "6379:6379"
# Spring Boot
app:
build: .
# 같은 경로에 있는 Dockerfile을 이용해 빌드합니다.
ports:
- "8080:8080"
depends_on:
- db
- redis
# 다른 컨테이너에 의존 설정을 해두면, 위의 컨테이너가 실행된 이후에 실행됩니다.
다른 컨테이너의 IP 주소를 알지 않아도, docker-compose의 설정에 의해 호스트네임을 얻을 수 있습니다.
# datasource
spring:
datasource:
url: jdbc:postgresql://db:5432/postgres
# docker-compose 에서 설정한 hostname을 사용할 수 있습니다.
# (미설정시 container name과 동일)
username: postegres
password: dontpostyourpasswordonyourblog
driver-cname-name: org.postgresql.Driver
# redis (docker container)
spring:
data:
redis:
host: redis
# 마찬가지로 hostname 을 사용합니다.
port: 6379
docker-compose build # 빌드를 진행합니다.
docker-compose up # 컨테이너를 실행합니다.
# CTRL+C로 종료할 수 있습니다.
docker-compose down # 컨테이너를 제거합니다.
docker-compose up --build
# 아니면 그냥 직접 해도 됩니다.
docker-compose build &&
docker-compose down
이제 복잡한 구성의 어플리케이션도 쉽게 공유할 수 있습니다. 클라우드 환경을 사용할 경우, 도커로 DB를 구성할 일은 없겠지만, 로컬 테스트 환경 구축에 편리하겠습니다.
다른 스택을 사용하는 개발자 등에게 개발 환경을 공유해야 할 일이 있다면 이 방법을 사용해보는 것도 좋겠습니다.