현재 토이 프로젝트로 진행하고 있는 게시판 프로젝트의 구성은 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
environment
postgresql
이 생성될 때 기본으로 생성되는 데이터베이스와 유저를 지정합니다.POSTGRES_DB
가 먼저 지정되지 않는 경우 데이터베이스가 없어 도커 컨테이너가 종료되는 현상이 발생했습니다.volumes
postgresql
의 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
volumes
redis
의 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
build
environment
application.yml
로 관리하던 DB
관련 설정을 docker-compose
로 분리했습니다.depends_on
DB
가 실행되기 전에 애플리케이션이 동작하는 것을 방지하고자 추가했습니다.# 실행
docker-compose up
# 백그라운드 실행
docker-compose up -d
# 애플리케이션이 수정되어 다시 빌드한 경우
# 댕글링 이미지 주의
docker-compose up -d --build
정상적으로 실행되는 것을 확인할 수 있습니다.