docker-compose + Springboot + Postgresql + Redis

appti·2022년 7월 1일
1

docker-compose + Springboot + Postgresql + Redis

현재 토이 프로젝트로 진행하고 있는 게시판 프로젝트의 구성은 Springboot + H2 Database + Redis입니다.

그래서 애플리케이션을 실행할 때 마다 H2 DatabaseRedis를 우선 실행해야 한다는 불편함이 있었는데, 이를 해결하기 위해 모두 도커 이미지로 처리하고 docker-compose로 연동해서 애플리케이션을 실행해보고자 합니다.

Dockerfile

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 입니다.

docker-compose.yml

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

각 서비스에 대해 제가 중요하다고 생각되는 부분만 간략하게 살펴보겠습니다.

postgresql

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
    • postgresqlvolume/var/lib/postgresql/data 입니다.
  • pgadmin 사용을 고려했으나 개인적으로는 shell에서 접근하는 게 편해 사용하지 않았습니다.

외부에서 postgresql에 접근하기 위해서 다음과 같이 실행합니다.

docker exec -it postgres bash

psql -U <POSTGRES_USER> -d <POSTGRES_DB>

redis

cache:
  container_name: redis
  image: redis:alpine
  ports:
    - 6379:6379
  volumes:
    - /Users/labtop/intellij/docker-redis/:/data
  • volumes
    • redisvolume/data 입니다.

외부에서 redis에 접근하기 위해서는 다음과 같이 실행합니다.

docker exec -it redis redis-cli

application

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 실행

# 실행
docker-compose up

# 백그라운드 실행
docker-compose up -d

# 애플리케이션이 수정되어 다시 빌드한 경우
# 댕글링 이미지 주의
docker-compose up -d --build 

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

profile
안녕하세요

0개의 댓글