Spring Boot와 Docker를 활용한 애플리케이션 배포
Overview
Spring Boot와 Docker를 결합하면, Spring Boot 애플리케이션을 컨테이너화하여 보다 일관되게 개발하고 배포할 수 있습니다. Docker를 사용하면 애플리케이션의 종속성과 환경 설정을 모두 컨테이너 안에 포함시킬 수 있어, 다양한 환경에서 동일하게 실행될 수 있습니다. 이번에는 Spring Boot 애플리케이션을 Docker로 컨테이너화하는 과정과 관련된 모든 것을 자세히 설명하겠습니다.
1. Spring Boot 애플리케이션 준비하기
Spring Boot는 자바 기반의 애플리케이션을 신속하게 개발할 수 있도록 돕는 프레임워크입니다. Spring Boot 애플리케이션을 Docker 컨테이너로 만들기 전에, 먼저 기본적인 Spring Boot 애플리케이션을 생성해야 합니다.
1.1 Spring Boot 프로젝트 생성
- Spring Initializr를 통해 새로운 프로젝트를 생성합니다.
- Project: Maven Project (또는 Gradle)
- Language: Java
- Spring Boot: 최신 안정 버전 선택
- Project Metadata: 필요한 설정 입력 (예: Group, Artifact, Name 등)
- Dependencies: 'Spring Web', 'Spring Data JPA', 'H2 Database' (또는 필요한 의존성 선택)
- 생성된 프로젝트를 IDE (예: IntelliJ IDEA, Eclipse)에서 열고, 필요한 비즈니스 로직을 추가합니다.
1.2 애플리케이션 테스트
프로젝트를 IDE에서 실행하여 애플리케이션이 제대로 작동하는지 확인합니다. 예를 들어, 기본적인 REST API를 만들고 Postman으로 테스트합니다.
2. Docker 환경 설정
Docker는 애플리케이션을 격리된 환경에서 실행할 수 있도록 해주는 플랫폼입니다. Docker를 사용하여 Spring Boot 애플리케이션을 컨테이너화할 수 있습니다.
2.1 Dockerfile 작성
Dockerfile
은 Docker 이미지 생성을 위한 스크립트입니다. Spring Boot 애플리케이션을 Docker 컨테이너로 빌드하기 위해 Dockerfile
을 작성합니다. 다음은 기본적인 Dockerfile
예제입니다:
# 사용하려는 JDK 버전의 이미지 선택
FROM openjdk:17-jdk-slim
# JAR 파일을 컨테이너의 /app 디렉토리에 복사
COPY target/myapp.jar /app/myapp.jar
# 컨테이너 실행 시 JAR 파일을 실행
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
# 애플리케이션이 사용할 포트 지정
EXPOSE 8080
이 Dockerfile
은 OpenJDK 17을 베이스로 하고, target/myapp.jar
파일을 /app/myapp.jar
로 복사하여 실행합니다.
2.2 Docker 이미지 빌드
Dockerfile을 작성한 후, Docker 이미지를 빌드합니다. 터미널에서 다음 명령어를 입력합니다:
docker build -t myapp:latest .
이 명령어는 현재 디렉토리에 있는 Dockerfile
을 기반으로 myapp:latest
라는 이름의 이미지를 생성합니다.
2.3 Docker 컨테이너 실행
빌드된 Docker 이미지를 기반으로 컨테이너를 실행합니다:
docker run -p 8080:8080 myapp:latest
이 명령어는 컨테이너의 8080 포트를 호스트의 8080 포트와 매핑하여 실행합니다. 이제 브라우저에서 http://localhost:8080
으로 애플리케이션에 접근할 수 있습니다.
3. Docker Compose 사용하기
Docker Compose는 여러 개의 Docker 컨테이너를 쉽게 관리할 수 있도록 돕는 도구입니다. 복잡한 애플리케이션을 여러 컨테이너로 구성해야 할 때 유용합니다.
3.1 docker-compose.yml 작성
다음은 기본적인 docker-compose.yml
파일의 예제입니다:
version: '3'
services:
app:
image: myapp:latest
ports:
- "8080:8080"
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
이 파일은 myapp:latest
이미지를 사용하여 app
이라는 서비스를 정의합니다. 8080
포트를 외부와 매핑하고, mynetwork
라는 네트워크를 설정합니다.
3.2 Docker Compose로 컨테이너 실행
터미널에서 다음 명령어를 입력하여 Docker Compose를 실행합니다:
docker-compose up
이 명령어는 docker-compose.yml
파일을 기반으로 필요한 컨테이너를 생성하고 실행합니다.
4. Docker와 CI/CD 파이프라인 통합
Docker를 사용하여 애플리케이션을 배포하면, CI/CD 파이프라인에서 자동화된 배포가 가능합니다. Jenkins, GitLab CI, GitHub Actions 등과 통합하여 코드 푸시 시 자동으로 Docker 이미지를 빌드하고 배포할 수 있습니다.
4.1 Jenkins와 Docker 통합 예제
Jenkins 설치 및 설정: Jenkins를 설치하고, Docker 플러그인을 추가합니다.
Pipeline 설정: Jenkins의
Jenkinsfile
을 작성하여 Docker 이미지를 빌드하고, 테스트 후 배포할 수 있도록 설정합니다.
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
docker.build('myapp:latest')
}
}
}
stage('Test') {
steps {
sh 'docker run myapp:latest ./run-tests.sh'
}
}
stage('Deploy') {
steps {
script {
docker.image('myapp:latest').push('latest')
}
}
}
}
}
이 Jenkinsfile
은 애플리케이션을 빌드하고, 테스트한 후, 이미지를 배포하는 파이프라인을 설정합니다.
5. 오류 및 해결 방법
5.1 Dockerfile 빌드 오류
오류 메시지:
Step 1/4 : FROM openjdk:17-jdk-slim
Pulling repository docker.io/library/openjdk
...
Error response from daemon: manifest for openjdk:17-jdk-slim not found
해결 방법:
이 오류는 지정한 이미지가 존재하지 않을 때 발생합니다. JDK 버전이나 이미지 이름을 확인하고, Docker Hub에서 사용할 수 있는 이미지를 검색해 수정합니다.
5.2 컨테이너 실행 오류
오류 메시지:
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:8080: bind: address already in use
해결 방법:
호스트의 포트 8080
이 이미 사용 중인 경우입니다. 다른 포트를 사용하거나, 해당 포트를 사용 중인 프로세스를 종료합니다.
참고문서
이 문서들을 참고하여 Spring Boot 애플리케이션과 Docker를 활용한 컨테이너화를 잘 이해하고, 실습해보시기 바랍니다.
'Study Information Technology' 카테고리의 다른 글
Spring Boot와 OpenAPI로 강력한 REST API 만들기 (0) | 2024.08.14 |
---|---|
Spring Boot와 RESTful API 구축하기 (1) | 2024.08.13 |
Spring Boot와 OAuth 20을 사용한 SSO Single SignOn 구현 (0) | 2024.08.13 |
Spring Boot와 Mockito 단위 테스트의 이상적인 조합 (1) | 2024.08.13 |
Spring Boot와 JUnit 단위 테스트를 위한 완벽한 조합 (0) | 2024.08.13 |