Docker

[Docker] Docker를 이용한 Spring 프로젝트

goblin- 2024. 10. 28. 13:45

Spring 프로젝트에서 Docker를 사용하는 이유는 애플리케이션의 실행 환경을 일관성 있게 유지하고 배포를 자동화하기 위함입니다. Docker는 개발, 테스트, 배포 환경에서 동일한 환경을 제공하여, “내 로컬에서는 작동하는데 서버에서는 작동하지 않는다”는 문제를 해결하는 데 매우 유용합니다. 아래에서 Docker가 Spring 프로젝트에서 어떻게 사용되는지, 주요 단계와 활용 사례를 설명하겠습니다.

 

1. Docker로 스프링 프로젝트의 환경 일관성 유지

 

Spring 프로젝트는 일반적으로 Java 환경이 필요하며, 추가적으로 데이터베이스나 Redis 같은 외부 서비스와 연동될 수 있습니다. Docker를 사용하면 Spring 애플리케이션의 실행 환경과 필요한 서비스들(MySQL, Redis 등)을 이미지로 만들어 로컬과 서버에서 일관되게 실행할 수 있습니다.

 

Dockerfile 작성 및 이미지 생성

 

Spring 프로젝트를 Docker에서 실행하려면 Dockerfile을 작성해야 합니다. 이 Dockerfile은 Spring 애플리케이션을 빌드하고 실행하기 위한 모든 환경을 정의합니다.

 

Dockerfile 예시

# 1. Java 환경을 갖춘 베이스 이미지 사용
FROM openjdk:17-alpine

# 2. 애플리케이션 파일을 저장할 디렉터리 설정
WORKDIR /app

# 3. 빌드된 JAR 파일을 Docker 이미지에 복사
COPY build/libs/myapp.jar app.jar

# 4. 컨테이너 시작 시 JAR 파일을 실행하는 명령 설정
ENTRYPOINT ["java", "-jar", "app.jar"]

Java 환경 제공: openjdk:17-alpine 이미지를 사용하여 Docker 컨테이너 내부에서 Java 애플리케이션을 실행할 수 있는 환경을 만듭니다.

애플리케이션 빌드 결과 복사: 프로젝트 빌드 후 생성된 myapp.jar 파일을 컨테이너에 복사합니다.

자동 실행 설정: 컨테이너가 실행될 때 java -jar app.jar 명령어가 실행되어 애플리케이션이 시작됩니다.

 

이 Dockerfile을 통해 Spring 프로젝트를 배포할 때 동일한 Java 버전, 동일한 파일 구조를 유지할 수 있어 환경 차이로 인한 문제가 발생하지 않습니다.

 

2. Docker Compose로 여러 서비스 관리 (데이터베이스, 캐시 등)

 

Spring 애플리케이션은 데이터베이스(MySQL, PostgreSQL), 캐시(Redis), 메시지 브로커(RabbitMQ) 같은 추가 서비스와 함께 작동하는 경우가 많습니다. Docker Compose를 사용하면 이러한 서비스를 한 번에 정의하고, 쉽게 실행할 수 있습니다.

 

Docker Compose 예시

 

docker-compose.yml 파일을 사용해 Spring 애플리케이션과 MySQL 데이터베이스를 함께 실행할 수 있습니다.

version: '3.8'

services:
  spring-app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=rootpass
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: mydatabase
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "3306:3306"

Spring 애플리케이션과 MySQL 연동: Spring 애플리케이션(spring-app)과 MySQL 데이터베이스(db)를 각각의 서비스로 정의하여, 두 서비스가 서로 연결될 수 있도록 설정합니다.

환경 변수 설정: Spring 애플리케이션이 MySQL 데이터베이스에 연결할 수 있도록 SPRING_DATASOURCE_URL 등을 환경 변수로 설정합니다.

종속성 관리: depends_on 옵션을 사용하여 데이터베이스가 실행된 후에 Spring 애플리케이션이 실행되도록 설정합니다.

 

이렇게 Docker Compose를 사용하면, Spring 애플리케이션과 필요한 모든 서비스들을 손쉽게 실행 및 관리할 수 있습니다.

 

3. CI/CD 파이프라인에서 Docker를 통한 자동화 배포

 

Docker 이미지를 사용하여 GitHub Actions, GitLab CI/CD 등과 연동해 CI/CD 파이프라인을 구축할 수 있습니다. Docker 이미지는 특정 Spring 애플리케이션 버전을 포함하고 있어 테스트, 빌드, 배포가 자동화됩니다.

 

CI/CD 파이프라인 예시 (GitHub Actions)

name: Build and Deploy

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v2
        with:
          java-version: '17'

      - name: Build Spring app
        run: ./gradlew build

      - name: Build Docker image
        run: docker build -t my-spring-app .

      - name: Push Docker image to Docker Hub
        run: docker push my-dockerhub-username/my-spring-app:latest

이 설정은 코드가 변경될 때마다 Docker 이미지를 자동으로 빌드하고 Docker Hub에 업로드하도록 구성합니다. 이후, EC2와 같은 서버에서는 Docker Hub에 있는 최신 이미지를 가져와 배포할 수 있습니다.

 

4. Docker를 통해 스프링 애플리케이션 배포 및 테스트

 

Spring 애플리케이션을 Docker로 배포하면, 로컬에서 실행하는 것과 동일한 환경으로 테스트할 수 있습니다.

 

로컬에서 Docker로 Spring 애플리케이션 실행

 

1. Docker 이미지 빌드:

docker build -t my-spring-app .

 

2. Docker 컨테이너 실행:

docker run -p 8080:8080 my-spring-app

애플리케이션을 로컬에서 테스트하려면 브라우저나 API 도구(예: Postman)에서 http://localhost:8080으로 접근하여 애플리케이션이 정상적으로 작동하는지 확인할 수 있습니다.

 

3. EC2나 클라우드에 배포:

Docker 이미지를 Docker Hub에 푸시한 후, 클라우드 서버(예: AWS EC2)에서 이미지를 Pull하고 실행하면 로컬과 동일한 환경으로 Spring 애플리케이션을 배포할 수 있습니다.

 

Docker로 Spring 프로젝트를 사용하는 장점

 

환경 일관성: 개발, 테스트, 배포 환경이 동일하여 환경 차이로 인한 문제를 방지합니다.

배포 자동화: CI/CD 파이프라인에서 Docker 이미지를 활용하여, 코드를 푸시할 때마다 자동으로 배포할 수 있습니다.

다중 서비스 통합: Docker Compose를 사용하여 Spring 애플리케이션과 데이터베이스, 캐시 등 여러 서비스를 손쉽게 실행할 수 있습니다.

이식성: 한 번 빌드된 Docker 이미지는 어디서든 동일하게 실행될 수 있어, 로컬과 서버 간의 이동이 쉽습니다.

 

요약

 

Spring 프로젝트에서 Docker는 애플리케이션의 일관된 환경을 제공하고, 다양한 서비스와의 연동을 손쉽게 관리할 수 있는 방법입니다. Dockerfile과 Docker Compose를 사용하여 개발 환경을 구축하고, CI/CD 파이프라인과 연계하면 코드 변경 시 자동으로 빌드, 테스트, 배포까지 이루어져 자동화된 배포 환경을 구축할 수 있습니다.