현재 토이 프로젝트로 진행하고 있는 게시판 프로젝트의 구성은 Springboot + H2 Database + Redis입니다.
그래서 애플리케이션을 실행할 때 마다 H2 Database와 Redis를 우선 실행해야 한다는 불편함이 있었는데, 이를 해결하기 위해 모두 도커 이미지로 처리하고 docker-compose로 연동해서 애플리케이션을 실행해보고자 합니다.
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
ADD ${JAR_FILE} board.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/board.jar"]
스프링부트 애플리케이션을 도커 이미지로 빌드하기 위한 Dockerfile 입니다.
version: "3.7"
services:
database:
container_name: postgres
image: postgres:latest
restart: always
ports:
- 5432:5432
environment:
POSTGRES_DB: board_db
POSTGRES_USER: board
POSTGRES_PASSWORD: board
volumes:
- /Users/labtop/intellij/docker-postgres/:/var/lib/postgresql/data
cache:
container_name: redis
image: redis:alpine
ports:
- 6379:6379
volumes:
- /Users/labtop/intellij/docker-redis/:/data
application:
container_name: board
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://database:5432/board_db
SPRING_DATASOURCE_USERNAME: board
SPRING_DATASOURCE_PASSWORD: board
depends_on:
- database
- cache
각 서비스에 대해 제가 중요하다고 생각되는 부분만 간략하게 살펴보겠습니다.
database:
container_name: postgres
image: postgres:latest
restart: always
ports:
- 5432:5432
environment:
POSTGRES_DB: board_db
POSTGRES_USER: board
POSTGRES_PASSWORD: board
volumes:
- ./postgres/:/var/lib/postgresql/data
environmentpostgresql이 생성될 때 기본으로 생성되는 데이터베이스와 유저를 지정합니다.POSTGRES_DB가 먼저 지정되지 않는 경우 데이터베이스가 없어 도커 컨테이너가 종료되는 현상이 발생했습니다.volumespostgresql의 volume은 /var/lib/postgresql/data 입니다.pgadmin 사용을 고려했으나 개인적으로는 shell에서 접근하는 게 편해 사용하지 않았습니다.외부에서 postgresql에 접근하기 위해서 다음과 같이 실행합니다.
docker exec -it postgres bash
psql -U <POSTGRES_USER> -d <POSTGRES_DB>
cache:
container_name: redis
image: redis:alpine
ports:
- 6379:6379
volumes:
- /Users/labtop/intellij/docker-redis/:/data
volumesredis의 volume은 /data 입니다.외부에서 redis에 접근하기 위해서는 다음과 같이 실행합니다.
docker exec -it redis redis-cli
application:
container_name: board
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://database:5432/board_db
SPRING_DATASOURCE_USERNAME: board
SPRING_DATASOURCE_PASSWORD: board
depends_on:
- database
- cache
buildenvironmentapplication.yml로 관리하던 DB 관련 설정을 docker-compose로 분리했습니다.depends_onDB가 실행되기 전에 애플리케이션이 동작하는 것을 방지하고자 추가했습니다.# 실행
docker-compose up
# 백그라운드 실행
docker-compose up -d
# 애플리케이션이 수정되어 다시 빌드한 경우
# 댕글링 이미지 주의
docker-compose up -d --build

정상적으로 실행되는 것을 확인할 수 있습니다.