쿠버네티스에서 스프링부트 서버를 파드로 띄우는 과정을 알아보자.
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
실습 내용은 인프런 강의 <비전공자도 이해할 수 있는 쿠버네티스 입문/실전>을 참고했다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (3) (0) | 2026.01.06 |
|---|---|
| [Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (2) (0) | 2026.01.05 |
| [Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (0) | 2026.01.01 |
| [Docker] 컨테이너의 네트워크 구조: docker0과 veth (0) | 2026.01.01 |
| [Docker] 컨테이너 통신: 링크(--link) 옵션을 활용해서 WordPress와 DB 연동하기 (0) | 2026.01.01 |