본문 바로가기
실습/리눅스 서버 + 스프링 부트

[Spring Boot] Docker 컨테이너로 띄우기

by 이민우 2025. 3. 11.
728x90
반응형

프로그램을 만들면 그 프로그램이 항상 동일한 환경에서만 돌아갈까?

 

물론 특정 환경에 최적화되어 그 환경에서만 돌아가는 프로그램이 요구사항이었다면 충분히 그럴 수 있다.

 

그러면 어느 환경에서도 돌아가야하는 솔루션은 어떨까?

 

물론 환경이 아무리 제각각이어도 마음먹고 돌리려면 방법이야 많다.

하지만 환경이 변할 때마다 그 환경에 맞춰 프로그램을 실행시키는 것은 여간 귀찮은 일이 아니다.

그러면 "어느 환경에서도 동일하게 프로그램을 실행시키고 싶을 때"는 어떻게 하면 될까?

 

방법이야 여러 가지가 있겠지만, 오늘은 그 방법 중 하나로 Docker 컨테이너로 만드는 방법을 소개하고 싶다.

* 실제로 우리 회사는 이렇게 여러 환경에서 돌아가는 솔루션을 만들 때 일단 Docker 컨테이너하 한다.

스프링 어플리케이션을 Docker로 컨테이너화하면 다음과 같은 장점이 있다.

 

  • 일관된 실행 환경 제공
    • 개발, 테스트, 운영 환경에서 동일한 환경을 유지할 수 있다.
    • Java 버전이나 OS 차이로 인한 문제를 방지할 수 있다.
  • 배포 및 확장 용이
    • CI/CD 파이프라인과 쉽게 통합할 수 있어 배포가 자동화된다.
    • Kubernetes 등의 오케스트레이션 도구와 연동하여 확장이 가능하다.
  • 독립적인 실행
    • 컨테이너 내부에서 실행되므로 다른 애플리케이션과 충돌 없이 독립적으로 실행된다.
    • 필요할 때 컨테이너를 쉽게 삭제하고 다시 생성할 수 있다.

 

 

Docker 컨테이너화 실습

 

데모 프로그램 만들기

 

일단 아래 버전으로 Spring Boot 어플리케이션을 만들었다.

  • jdk 23
  • spring 3.4.3
  • maven

테스트용 프로그램이므로, dependency는 아래와 같이 간단하게 Spring Web만 포함한다.

 

프로그램은 간단하게 application.properties 내 내용을 String으로 return하는 API를 만들어보자.

 

우선 return할 값을 지정하기 위해 application.properties에 demo.text 설정을 만들어 입력한다.

server.port=9999
demo.text=docker-test

 

그리고 DemoController에 방금 작성한 문구를 return하는 API를 생성한다.

 

DemoController.java

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

	@Value("${demo.text}")
	private String text;
	
	@GetMapping("/demo")
	public String returnTxt() {
		return text;
	}
	
}

 

 

완성되었다면 실행을 시켜셔 테스트를 통해 잘 나오는지 확인해보자.


 

Docker 이미지로 만들기

 

프로그램이 잘 완성되었으니, 이제 Docker 이미지로 말아서 서버에 올려볼 차례이다.

 

가장 먼저 Dockerfile을 만들어보자.

 

DockerfileDocker 컨테이너를 만들기 위한 설정파일로, 해당 파일을 기반으로 어플리케이션의 실행 환경을 정의하고 컨테이너 이미지를 빌드할 수 있다.

 

Dockerfileroot 디렉터리에 위치할 수 있도록 프로젝트를 우클릭해서 New > File 을 순차 선택한 후 Dockerfile을 만든다.

File에서 파일명을 Dockerfile로 지정



그러면 아래와 같이 root 디렉터리에 Dockefile 파일이 생성될 것이다.

 

만들어진 Dockerfile 안에 아래 내용을 입력한다. 설명은 주석으로 달아놓았다.

# 1. 사용할 기본 이미지 지정
# JDK 23으로 생성한 프로젝트이므로 Ubuntu 기반 Java23으로 실행
FROM eclipse-temurin:23-jdk-alpine


# 2. 컨테이너 내부에서 사용할 작업 디렉토리 생성
WORKDIR /app


# 3. 현재 디렉토리의 JAR 파일을 app.jar로 복사
# maven package 시 target/{application_name}.jar이 생기는걸 app.jar로 복사
COPY target/*.jar app.jar


# 4. 컨테이너가 실행될 때 실행할 명령어
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

 

Dockerfile 작성 완료 후 Maven으로 패키징을 수행한다.

 

간단하게 IDE 환경에서 Goals에 package를 넣고 수행했다.

* 참고로 gradle을 사용할 경우 package가 아닌 build를 수행해야 한다.

Goals에 package 입력



package가 완료되었다면 아래와 같이 target 디렉터리 아래에 jar 파일이 정상적으로 생성됨을 확인할 수 있다.

 

 

이제 해당 프로젝트의 디렉터리에서 cmd를 실행하고 아래 명령어를 입력한다.

명령어는 docker-demo 라는 이름의 0.0.1 버전으로 프로젝트를 컨테이너로 만드는 명령어다.

* Docker가 정상적으로 설치 완료된 환경이어야 함을 유의하자.

docker build -t docker-demo:0.0.1 .

 

위와 같이 완료되었다면 아래 명령어를 통해 정상적으로 이미지가 말아졌는지 확인한다.

 

docker images

 

정상적으로 말아졌다면 아래 명령어를 통해 이미지를 tar 파일로 추출한다.

docker save -o docker-demo.tar docker-demo:0.0.1

 

명령어가 완료되면 아래와 같이 docker-demo.tar 파일이 생겼을 것이다.

 


Linux 서버에 올려보기

 

이제 실제로 배포를 한다고 생각하고, Linux 서버에서 해당 프로그램을 Docker로 돌려보자.
서버는 Rocky Linux 8.8버전을 사용했다.

 

우선 만들어진 tar 파일을 application.properties와 함께 서버로 옮긴다.

디렉터리는 /app/docker-demo/ 로 설정했다.

 

파일을 옮긴 후 아래 명령어를 이용해 tar 파일을 이미지로 풀어야 한다.

docker load -i docker-demo.tar

 

tar 파일이 이미지로 풀렸다면 이제 아래 명령어를 통해 만들어진 이미지를 컨테이너로 실행시킬 수 있다.

docker run -d --name docker-demo \
-v /app/docker-demo/application.properties:/app/application.properties \
-p 8080:9999 \
docker-demo:0.0.1 \
--spring.config.location=file:/app/application.properties

 

* docker-compose로 만들면 더 편하다.

* 마지막의 spring.config.location은 Dockerfile 안 ENTRYPOINT에 넣어도 무방하다.

 

컨테이너가 뜨면 아래와 같이 웹 사이트에 잘 들어가질 것이다.

 

추가로 application.properties를 외부로 뺐기에, application.properties를 자유자재로 바꾸어서 실행할 수도 있다.

 

예를 들어 아래와 같이 demo.text를 바꿔보자.

changed demo text로 변경

 

그리고 아래 명령어를 통해 컨테이너를 재실행하면 정상적으로 application.properties 내 내용이 변경되어 적용됨을 확인할 수 있다.

 

docker restart docker-demo

 

728x90
반응형