[Docker] spring boot + mariaDB + Redis docker compose로 연동하기

박준형·2023년 9월 8일

Docker

목록 보기
1/1
post-thumbnail

📌1. docker-compose.yml 작성

1. 프로젝트 이름이 될 빈폴더를 만든다.
2. 빈폴더 안에 docker-compose.yml 파일을 만든다.
3. version: '3' 은 3으로 시작하는 가장 최신 버전을 사용한다는 뜻이다.
4. services 아래에 내가 만들 컨테이너들을 포함하면 된다.

version: '3'

services:
  db:
    image: mariadb
    environment:
      - MARIADB_ROOT_PASSWORD=root
    ports:
      - "3306:3306"

  redis:
    container_name: redis
    
    image: redis
    ports:
      - "6379:6379"

  backend:
    build:
      context: .
      dockerfile: ./compose/springboot/Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./:/app/
    depends_on:
      - db
      - redis

일단 작성해두고 자세한 설명은 각 컨테이너 설정부분에서 하겠다.


📌2. MariaDB

db:
    image: mariadb
    environment:
      - MARIADB_ROOT_PASSWORD=root
    ports:
      - "3306:3306"

1. db는 컨테이너이름이 된다. (compose하면 db-1 형식으로 이름이 만들어짐)
2. MARIADB_ROOT_PASSWORD=root 로 비밀번호를 설정한다.
3. prots로 내 3306포트와 도커 컨테이너의 3306포트를 매핑한다.


📌3. Redis

redis:
    container_name: redis
    
    image: redis
    ports:
      - "6379:6379"

1. container_name으로 컨테이너 이름을 redis로 설정(위에 처럼 -1 이런게 안붙고 설정 그대로 생성됨)
2. prots로 내 6379포트와 도커 컨테이너의 6379포트를 매핑한다.


📌4. Spring Boot

backend:
    build:
      context: .
      dockerfile: ./compose/springboot/Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./:/app/
    depends_on:
      - db
      - redis

Dockerfile

FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

1. 위에서 만든 docker-compose.yml 파일이 들어있는 폴더로 가서 compose/springboot 경로에 폴더를 생성한다.
2. compose/springboot에 Dockerfile을 생성한다.
3. FROM 부분에 자신이 사용한 자바버전으로 바꾸면 된다.
4. build: dockerfile: 경로에 있는 Dockerfile이 실행되면서 빌드된다.
5. depends_on은 위에서 만든 db, redis 컨테이너가 실행되고 backend 컨테이너가 실행된다.

spring:
  datasource:
    url: jdbc:mariadb://gdg-project-db-1:3306/ofi
    driver-class-name: org.mariadb.jdbc.Driver
    username: root
    password: root
  redis:
    host: redis
    port: 6379

추가적으로 application.yml 파일을 위에 처럼 수정해줘야 한다.
datasource url을 해당 프로젝트 이름(gdg-project) - mariadb 컨테이너 이름(db-1)로 수정하고 redis의 host를 redis 컨테이너 이름(redis)로 수정한다. 여기서 프로젝트 이름은 맨 처음에 만든 루트 폴더의 이름이 된다.


📌5. jar 파일 생성하기

spring 프로젝트를 도커에 올리려면 jar 파일로 압축해야 한다. jar 파일은 다음과 같이 만들수 있다.


IntelliJ 화면 우측에 Gradle 클릭 -> Tasks -> build -> bootjar 순서로 클릭한다.


그러면 프로젝트 폴더 -> build -> libs 경로에 jar 파일이 생성된다.


만들어진 jar 파일을 맨 처음에 만든 루트 폴더에 옮겨준다.


📌6. docker-compose로 실행하기

docker-compose up --build -d

터미널로 루트 폴더로 이동해서 위 명령어를 실행한다.


build가 완료되면 위에처럼 뜨게 된다.


docker에 들어가면 이렇게 컨테이너가 생성된 것을 볼 수 있다.


📌7. MariaDB 추가 설정

처음 실행하면 backend 컨테이너가 종료된다. 그 이유는 mariaDB에 아무런 데이터베이스가 없어서 강제로 종료시킨다. 그래서 데이터베이스를 만들어주는 작업을 해야한다. (추후에 빌드시 바로 데이터베이스가 생성되게 해볼 예정)


db-1을 클릭하면 위 화면처럼 보일 것이다. 저기서 Terminal을 눌러 이동해준다.

mariadb -uroot -proot

터미널에서 위 명령어를 실행해서 mariadb로 이동한다.

create database 원하는 데이터베이스 이름

데이터베이스를 생성한다.

이후에 backend 컨테이너를 실행하면 정상적으로 작동한다.

📌데이터베이스 자동 생성

컨테이너를 새로 만들 때마다 커맨드를 실행하는게 귀찮아서 자동화 하는 방법을 추가했다.

  • 먼저 도커 프로젝트 폴더 최상단에 scripts 폴더를 만든다.
  • 해당 폴더 안에 init.sql 파일을 생성한다.
//init.sql
CREATE DATABASE IF NOT EXISTS 생성할 데이터베이스 이름;
  • 이후 docker-compose.yml 파일을 아래와 같이 수정한다.
db:
    image: mariadb
    environment:
      - MARIADB_ROOT_PASSWORD=root
    ports:
      - 3306:3306
    volumes:
      - "./scripts/init.sql:/docker-entrypoint-initdb.d/1.sql"

이렇게 하면 번거롭게 터미널에서 명령어 입력 없이 자동으로 데이터베이스가 생성된다.

참고 블로그

profile
으쌰 으쌰

1개의 댓글

comment-user-thumbnail
2023년 9월 11일

엄청 자세하게 적어주셨군요!! 이렇게 기록해두면 나중에 기억이 안 날 때 참고할 수도 있을 것 같아요. 파이팅해봐요 🔥🔥

답글 달기