본문 바로가기
AI Journey/클라우드

[Kubernetese] 스프링부트(Spring boot) 서버를 파드(Pod)로 띄우기

by 보눔비스타 2026. 1. 3.

쿠버네티스에서 스프링부트 서버를 파드로 띄우는 과정을 알아보자.

1. IDE에 스프링 프로젝트 열기

먼저 스프링 이니셜라이저(Spring Initializr)에서 스프링부트(Spring Boot) 프로젝트 demo 파일(zip)을 다운받아서 원하는 경로에 압축을 풀어놓는다.

이전 포스팅 참고 : https://nanujahope.tistory.com/105

 

그 다음, IDE에(ex. IntelliJ) 스프링 프로젝트(ex. demo)를 오픈한다.

2. 테스트용 코드 작성

src/main/java/com.example.demo/ 디렉토리에 AppController라는 자바 클래스를 새로 만든다. 

파드가 실행되는 것만 확인하는 용도이므로 다음과 같이 간단한 예시 코드를 복붙해서 정상적으로 실행(run)되는지 확인한다.

 

[예시 코드]

package com.example.demo;

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

@RestController
public class AppController {

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

 

스프링부트(Spring Boot) 애플리케이션은 기본적으로 내장 톰캣(Tomcat)을 사용하여 8080 포트에서 실행된다.

다음과 같이 웹 브라우저에서 주소창에 localhost:8080을 치면 스프링 서버가 정상적으로 뜨는 것을 확인할 수 있다. 

 

3. 도커 이미지 생성

이렇게 스프링 서버가 정상 동작하는 것을 확인했으므로, 다음은 도커 이미지 생성을 위해 /demo/ 밑에 Dockerfile을 생성한다. 

FROM eclipse-temurin:17-jdk  #Java 17 환경을 준비

COPY build/libs/*SNAPSHOT.jar app.jar  #빌드된 jar 파일을 가져오기

ENTRYPOINT ["java", "-jar", "/app.jar"]  #자바 명령어로 실행

 

FROM eclipse-temurin:17-jdk

베이스 이미지(기반이 되는 환경)를 가져옴

  • 의미: 이 도커 이미지는 eclipse-temurin이라는 곳에서 제공하는 Java 17 JDK 버전의 리눅스 환경 위에서 만들어진다는 뜻
    • eclipse-temurin: 예전의 OpenJDK(AdoptOpenJDK)를 잇는 무료 자바 배포판
    • jdk: Java Development Kit의 약자로, 자바 프로그램을 실행하고 개발할 수 있는 도구들이 포함되어 있음.

COPY build/libs/*SNAPSHOT.jar app.jar

호스트에 있는 빌드 파일을 컨테이너 안으로 복사함

  • 의미: 호스트의 build/libs/ 폴더에 있는 이름에 SNAPTSHOT이 포함된 .jar 파일을, 컨테이너 내부의 최상위 경로에 app.jar라는 이름으로 복사해 넣으라는 뜻
    • build/libs/ : 보통 Gradle로 빌드하면 결과물(.jar)이 생성되는 기본 경로입니다.
    • *SNAPTSHOT.jar : 파일명 전체를 적지 않고 *(와일드카드)를 사용한 이유: 버전이 바뀌어 파일명이 my-web-0.0.1-SNAPSHOT.jar에서 my-web-0.0.2-SNAPSHOT.jar로 바뀌더라도 Dockerfile을 수정할 필요 없이 자동으로 잡히도록 함.
    • app.jar : 복사된 파일의 이름을 심플하게 app.jar로 변경한다. 이렇게 하면 나중에 실행할 때 파일명을 고민할 필요가 없다.

ENTRYPOINT ["java", "-jar", "/app.jar"]

컨테이너가 시작될 때 실행할 명령어를 지정

  • 의미: 이 이미지를 기반으로 컨테이너(Pod)가 생성되어 시작될 때, 자동으로 java -jar /app.jar 명령어를 실행하라는 뜻
    • 이 명령어가 실행되면 Spring Boot 서버가 켜짐.
    • 파일 이름을 app.jar로 통일해두었기 때문에, 항상 /app.jar를 실행하면 된다.

위와 같이 Dockerfile을 작성하고 나면, 터미널에 다음 명령어를 쳐서 기존에 빌드된 파일을 청소하고 새로운 jar 파일로 빌드한다.

./gradlew clean build

 

그러면 아래와 같이 build/libs/ 밑에 SNAPSHOP.jar 파일이 생성되는데, 이 파일을 바탕으로 도커 이미지를 만들게 된다. 

 

다음으로, 아래 명령어로 "spring-server"라는 이름의 도커 이미지를 빌드한다.

** 도커 앱(데몬)이 실행되고 있어야 함. **

 docker build -t spring-server .

 

  • docker build :  이전에 작성한 Dockerfile이라는 텍스트 파일(설계도)을 읽어서, 실제로 실행 가능한 도커 이미지 파일로 만들라는 뜻.
  • -t : Tag(태그)의 약자. 생성될 이미지에 이름을 붙이는 옵션.
  • spring-server : 사용자가 정한 이미지 이름.
    • 뒤에 버전을 명시하지 않았으므로(예: spring-server:v1), 자동으로 spring-server:latest가 됨.
    • 나중에 이 이미지를 실행하거나 찾을 때 이 이름을 사용하게 된다.
  • .  : 점(. )은 현재 위치를 뜻함. 도커에게 "현재 경로에서 Dockerfile을 찾고, COPY 명령어로 복사할 파일(jar 파일 등)도 이 경로 기준(정확히는 Context)으로 찾아라"라고 알려줌

빌드가 완료되면 docker image ls 또는 docker images 명령어로 이미지가 잘 생성되었는지 확인한다.

이미지 목록에 spring-server:latest가 뜨면 성공적으로 빌드된 것이다.

 

4. Manifest 파일(yaml) 생성

/demo/ 밑에 spring-pod.yaml 파일을 생성한다. (파일명은 임의로 지을 수 있음) 

apiVersion: v1
kind: Pod

metadata:
  name: spring-pod

spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080

 

기본 정보 (Header)

 

  • apiVersion: v1 : 쿠버네티스 API의 버전을 의미. Pod는 가장 기초적인 리소스라서 안정화된 v1 버전을 사용.
  • kind: Pod : "지금 만들려는 것은 Pod(파드)"라고 종류를 명시.

메타데이터 (Metadata)

  • metadata : 리소스 자체의 이름이나 라벨 등 식별 정보를 담는 곳.
  • name: spring-pod : 이 파드의 고유 이름을 "spring-pod"로 짓겠다는 뜻. 나중에 kubectl get pod 명령어로 조회할 때 이 이름으로 표시된다.

상세 스펙 (Spec)

  • spec : 이 파드를 어떤 상태로 띄울 것인지 구체적인 내용을 정의함.
  • containers : 파드 안에는 하나 이상의 컨테이너가 들어갈 수 있기 때문에 여기서 컨테이너들을 나열한다.
  • - name: spring-container : 파드 내부에서 실행될 컨테이너의 이름입니다. (파드 이름과는 별개)
  • image: spring-server : 앞에서 docker build로 만든 이미지의 이름. "내 컴퓨터(혹은 저장소)에 있는 spring-server라는 이미지를 가져와서 실행하라"는 뜻.
  • imagePullPolicy: IfNotPresent : 내 컴퓨터(로컬)에 spring-server 이미지가 있는지 먼저 확인하고, 있으면 그것을 사용한다. 만약 로컬에 없다면, 그때 외부 저장소(Docker Hub 등)에서 다운로드를 시도한다. (로컬에서 빌드한 이미지를 사용할 때 가장 안전하고 범용적으로 쓰이는 옵션)
  • ports: 네트워크 포트 설정.
  • - containerPort: 8080 : "이 컨테이너는 8080번 포트를 열어두고 기다리고 있다"라고 명시하는 것. Spring Boot의 기본 포트가 8080이기 때문에 이렇게 적어주면 된다.

5. 파드 생성 및 실행

yaml 파일을 작성한 후, 아래 명령어로 파드를 생성해서 컨테이너를 실행한다. 

kubectl apply -f spring-pod.yaml

 

 

콘솔에 pod/spring-pod created 라는 메시지가 뜨면 파드가 정상적으로 생성된 것이다.

kubectl get pods 명령어로 파드가 실행되고 있는지 확인한다.

 

 

 

 

 

6. 서버 접속 확인

방법 1: 파드 내부에 접속해서 요청 보내기

kubectl exec -it spring-pod -- bash 명령어로 실행 중인 파드 내부로 들어가서 이 파드 안에서 실행 중인 스프링 서버(8080번 포트)에 GET 요청을 보낸다.

아래와 같이 뜨면 성공이다.

 

방법 2: 포트 포워딩으로 웹 브라우저에서 접속

kubectl port-forward pod/spring-pod 12345:8080 명령으로 로컬의 12345를 컨테이너의 8080 포트에 연결한다.

웹 브라우저에서 localhost:12345로 접속했을 때 아래와 같이 화면이 뜨면 서버에 정상적으로 접속된 것이다.

 

파드로 띄운 서버에 접속하는 위 두 가지 방법에 대한 보충 설명은 아래 포스팅에도 정리되어 있다.

https://nanujahope.tistory.com/100

 

[Kubernetese] Nginx 파드(Pod) 생성하고 포트 포워딩(port forwarding)하기

쿠버네티스에서 가장 기본이 되는 배포 단위인 파드(Pod)를 직접 생성하고, 내부 접속 및 외부 노출을 테스트하는 과정을 실습해본다.대표적 웹 서버인 Nginx 컨테이너를 띄우고, 로컬 환경에서 접

nanujahope.tistory.com

 

실습 내용은 인프런 강의 <비전공자도 이해할 수 있는 쿠버네티스 입문/실전>을 참고했다.