IT·테크/인프라

Docker 이미지와 컨테이너 — Spring Boot 앱으로 직접 만들어 보기

레루루 2026. 7. 25. 20:18
반응형

Docker 이미지와 컨테이너 — Spring Boot 앱으로 직접 만들어 보기

도커 엔진 환경에서 도커 이미지를 실행하면 컨테이너가 생성되고 동작합니다. 한 문장으로 요약되지만, 이미지와 컨테이너가 각각 무엇인지 나누어 보지 않으면 명령어를 외워도 손에 잡히지 않습니다.

이미지는 설계도다

도커 이미지는 컨테이너를 만들기 위한 설계도와 그 부품의 묶음입니다.

 

여기서 중요한 것은 이미지와 컨테이너가 일대일 관계가 아니라는 점입니다. 하나의 이미지로 여러 대의 컨테이너를 생성할 수 있습니다. 설계도 한 장으로 같은 건물을 여러 채 짓는 것과 같습니다.

 

이미지는 Dockerfile의 내용에 기반해 build됩니다. 즉 이미지를 만든다는 것은 결국 Dockerfile을 쓴다는 뜻입니다.

Spring Boot 앱을 이미지로 만들기

이 절은 2022년 10월, STS 환경을 기준으로 정리한 기록입니다.

1. Spring Boot JAR 파일 생성 (Gradle)

  1. [Run] - [Run Configurations…], 또는 프로젝트를 우클릭해 [Run As] - [Run Configurations…]
  2. [Gradle Task] - [New Configuration]
  3. [Gradle Tasks] - [Add]에 bootJar 입력, [Working Directory]에서 원하는 프로젝트 선택
  4. [Apply] 클릭 후 [Run] 클릭
  5. 프로젝트경로/build/libs/ 위치에 .jar 파일이 생성됩니다

build 폴더가 보이지 않는다면 Explorer filter에서 [Gradle build folder] 체크를 해제합니다.

2. Dockerfile 생성

Docker 이미지를 생성하는 데 사용할 파일들을 한 곳에 모은 뒤, 그 자리에 Dockerfile이라는 이름으로 빈 파일을 만듭니다. 앞서 뽑은 .jar 파일과 나란히 두면 됩니다.

FROM openjdk:11
ARG JAR_FILE=Spring Boot JAR 파일 이름
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

작성법은 Dockerfile reference를 참고합니다.

3. build

Dockerfile이 있는 위치에서 터미널을 열고 build 명령을 실행합니다.

$ docker build -t test-crud-app .

 

명령의 사용법은 다음과 같습니다.

$ docker build [OPTIONS] PATH | URL | -

 

자세한 옵션은 docker build 문서에 있습니다.

컨테이너는 프로세스다

도커 컨테이너는 도커 이미지를 기반으로 실행되고 종료되는 실제 프로세스입니다. 이미지가 정적인 설계도라면, 컨테이너는 지금 돌아가고 있는 실체입니다.

 

각 컨테이너는 외부와 격리되어 운영됩니다. 격리되어 있으므로 컨테이너 내부의 서비스를 밖에서 그냥 쓸 수는 없고, 포트 매핑으로 길을 내주어야 합니다.

$ docker run -p 8080:8080 test-crud-app

 

사용법은 다음과 같습니다.

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

자세한 옵션은 docker run 문서에 있습니다.

컨테이너끼리 통신하기

여러 개의 컨테이너를 작동시킨 후에는, 각 컨테이너와 맵핑된 호스트 포트를 사용해 서로 통신할 수 있습니다.

여기서 한 가지가 걸립니다. 컨테이너는 격리되어 있으므로 컨테이너 안에서의 localhost는 호스트가 아닙니다. 그래서 도커는 컨테이너 내부에서 호스트의 localhost에 접근하기 위한 host.docker.internal 도메인을 제공합니다.

 

간단한 컨테이너 네트워킹의 형태입니다. Spring Boot App은 8080, PostgreSQL은 5432 포트로 각각 동작하고, PostgreSQL은 호스트의 15432 포트에 매핑되어 있습니다. Spring에서는 host.docker.internal:15432로 DB에 접근할 수 있습니다.

이미지를 만들고, 컨테이너로 띄우고, 포트로 잇는다 — 도커를 다루는 기본 작업은 이 세 가지로 정리됩니다.

반응형