[3-tier 구축] 5️⃣-1 Docker로 Spring Boot 구축

하니·2024년 11월 4일

인프라

목록 보기
6/9

💠 임의의 프로젝트 생성


Group : 회사명. 어떤 그룹에서 이 프로젝트를 만들고 있는지 적는다.
Artifact : 내가 빌드할 프로젝트의 결과물 이름
(Name) : Optional - Artifact가 공식적 이름이라면 Name은 비공식적 이름이라고 생각하면 된다.
Package Name : 위의 옵션들과 함께 전체 패키지명이 결정된다.

dependency는 일단 아래와 같이 설정해주고 프로젝트를 생성해준다.

test 코드 작성

현재 따로 db를 설정해주지 않았기 때문에 h2로 해준다. (이후에 RDS로 진행할 예정이다.)

TestController.java

package hyundai.movie;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/test")
    public String test() {
        return "Hello, World!";
    }
}

application.yml

spring:
  config:
    import: "classpath:secret.yml"

  application:
    name: backend

  datasource:
    driver-class-name: org.h2.Driver  # H2 드라이버 클래스
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE  # 인메모리 H2 데이터베이스
    username: sa  # 기본 사용자 이름
    password:  # 기본적으로 비밀번호가 필요하지 않음

  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        hbm2ddl.auto: update  # Hibernate가 데이터베이스 스키마를 자동으로 생성 및 업데이트
    show-sql: true

  h2:
    console:
      enabled: true  # H2 콘솔 활성화

management:
  endpoints:
    web:
      exposure:
        include: health,info

build.gradle에 dependency 추가

dependencies {
    runtimeOnly 'com.h2database:h2'
}

깃허브 push

git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin {깃허브 레포지토리 주소}
git push -u origin main

💠 Dockerfile

FROM openjdk:17-jdk-alpine

# 인자 설정 - Jar_File
ARG JAR_FILE=build/libs/*.jar

# jar 파일 복제
COPY ${JAR_FILE} config.jar

# 실행 명령어
ENTRYPOINT ["java","-jar","config.jar"]

💠 로컬테스트

아래의 명령어를 통해 build/libs/ (또는 target/) 디렉토리에 .jar 파일이 생성된다.

# [Spring Boot 애플리케이션 빌드]

# Spring Boot 애플리케이션을 JAR 파일로 빌드
./gradlew build # Gradle

# 새로운 jar 파일 빌드
./gradlew clean build

1️⃣ Java 애플리케이션으로만 실행 (java -jar)

java -jar build/libs/movie-0.0.1-SNAPSHOT.jar

2️⃣ Docker 컨테이너에서 실행 (docker build 및 docker run)

# Docker 이미지 빌드
docker build -t jinii915/review-backend .

# Docker 컨테이너 실행
## 이미지가 빌드된 후, Docker 컨테이너를 실행하여 애플리케이션을 로컬에서 테스트
docker run --name backend-container -dp 8080:8080 jinii915/review-backend

이제 로컬 브라우저에서 http://localhost:8080/test 로 접근해 Spring Boot 애플리케이션이 제대로 실행되는지 확인한다.

💠 Docker hub

여기서부터는 [3-tier 구축] 4️⃣ Docker로 Nginx 웹서버 구축에서 진행한 프론트엔드와 같은 방식이다.

// docker hub에 push
docker push jinii915/review-backend

💠 EC2에서 이미지 Pull 및 컨테이너 실행

// 원하는 docker 이미지 pull
docker pull jinii915/review-backend

// Pull한 이미지로 컨테이너 실행
docker run --name backend-container -dp 8080:8080 jinii915/review-backend

❗️EC2의 아키텍처와 이미지의 이케틱처가 맞지 않는 에러 발생
프론트에서도 이런 에러가 발생했었으면서 왜 생각 못했지...
🙆🏻‍♀️ docker build --platform linux/amd64 -t {ImageName} . 명령어를 통해 빌드했던 이미지를 지우고 다시 빌드해줘야 한다.
이렇게 해서 로컬에서 docker image를 다시 빌드해서 클라우드 서버와 호환성을 맞춰주고 docker run 하면 정상적으로 실행 된다.

// 기존의 이미지 삭제 후,
// 프로젝트의 Dockerfile이 있는 터미널에서
docker build --platform linux/amd64 -t jinii915/review-backend:latest .
// docker hub에 다시 Push
docker push jinii915/review-backend
// ec2에서
docker pull jinii915/review-backend:latest
docker run --name backend-container -dp 8080:8080 jinii915/review-backend

결과

참고

[(Nginx+React)+SpringBoot] 웹 서비스 배포 - Docker Hub 활용

profile
Hi, I am HANI Developer(╹◡╹). .....1hani me?

0개의 댓글