개발자라면 한번쯤 겪어봤을 문제가 있다.
"엥? 로컬에서는 잘 됐는데... 왜 서버에서는 안되는걸까?"
이 문제의 원인은 내 컴퓨터와 서버의 환경(OS, 자바 버전, 설치된 라이브러리 등)이 다르기 때문이다. Docker는 이런 문제를 해결하기 위해 나왔다.
Docker는 '컨테이너'라는 기술을 사용한다. 컨테이너는 내 애플리케이션과 그 실행에 필요한 모든 환경(자바, 라이브러리 등)을 하나의 패키지로 묶어서 격리시킨 공간이다.
이 패키지는 어디서든 똑같이 동작하기 때문에, 내 컴퓨터에서 실행되던 것이 서버에서도, 동료의 컴퓨터에서도 똑같이 실행되는 것을 보장한다.
꼭 알아야 할 Docker 핵심 용어 3가지
붕어빵을 만든다고 생각해보자.
1. 이미지 (Image) :
- 비유 : 붕어빵 틀에 해당한다. 붕어빵을 만들기 위한 모든 재료(밀가루 반죽, 팥)와 레시피가 담겨있는 '설계도' 또는 '압축 파일'같은 것이다.
- 애플리케이션을 실행하는 데 필요한 모든 것(Java, Spring 애플리케이션 코드, 라이브러리 등)이 포함된 읽기 전용(Read-Only) 템플릿이다.
2. 컨테이너 (Container) :
- 비유 : 붕어빵 틀(이미지)로 찍어낸 실제 붕어빵이다. 우리는 붕어빵을 먹는 것이지, 붕어빵 틀을 먹는게 아니다.
- 이미지(Image)를 실제로 메모리에 올리고 실행한 인스턴스(프로세스)이다. 하나의 이미지로 여러 개의 컨테이너를 만들 수 있다.
3. Dockerfile :
- 비유 : 붕어빵 레시피이다. "밀가루 반죽을 넣고, 팥을 넣고, 3분간 굽는다"와 같이 이미지를 어떻게 만들지 순서대로 적어놓은 텍스트 파일이다.
- 개발자가 이미지를 만들기 위해 작성하는 스크립트이다. 이 Dockerfile을 실행하면 Docker가 알아서 이미지를 만들어준다.
정리해보면 개발자는 Dockerfile을 작성해서, Image를 만들고, 그 이미지를 실행해서 Container를 띄운다.
그렇다면 직접 내 애플리케이션을 Docker에 띄워보자
STEP 0 : Docker 설치하기
가장 먼저 내 컴퓨터에 Docker를 설치해야 한다. 아래 링크에서 'Docker Desktop'을 다운로드하여 설치한다. (Windows나 Mac에 맞는 버전을 설치하시면 된다.)
설치 후 Docker Desktop을 실행하면 준비 완료이다.
STEP 1: Spring Boot 애플리케이션 준비
1. 간단한 "Hello World"를 출력하는 Spring Boot 애플리케이션을 준비한다.
2. 가장 중요한 단계! 애플리케이션을 .jar 파일로 빌드해야 한다.
- Gradle 사용자: 터미널에서 .\gradlew build (또는 ./gradlew build) 실행
- Maven 사용자: 터미널에서 .\mvnw package (또는 ./mvnw package) 실행
3. 빌드가 성공하면 build/libs 또는 target 폴더 안에 프로젝트명-0.0.1-SNAPSHOT.jar 같은 파일이 생성된 것을 확인합니다.
STEP 2: Dockerfile 작성하기 (레시피 만들기)
# 1. 베이스 이미지 선택 (Java 17 버전을 사용)
# 'slim' 버전은 불필요한 것들을 빼서 용량이 가볍다.
FROM openjdk:17-jdk-slim
# 2. 컨테이너 내에서 작업할 디렉토리 생성
WORKDIR /app
# 3. 빌드된 .jar 파일을 컨테이너의 /app 디렉토리로 복사
# Gradle: build/libs/*.jar, Maven: target/*.jar 경로를 확인한다.
COPY build/libs/*.jar app.jar
# 4. 컨테이너가 시작될 때 실행할 명령어
# "java -jar app.jar" 명령어를 실행하여 애플리케이션을 구동한다.
ENTRYPOINT ["java", "-jar", "app.jar"]
STEP 3: Docker 이미지 빌드하기 (붕어빵 틀 만들기)
이제 터미널을 열고 프로젝트 최상위 폴더(Dockerfile이 있는 위치)에서 아래 명령어를 실행한다.
docker build -t my-spring-app .
- docker build: 이미지를 만드는 명령어이다.
- -t my-spring-app: 이미지에 my-spring-app이라는 이름(태그)을 붙여줍니다. 이름은 원하는 대로 바꿀 수 있다.
- . : 현재 디렉토리에 있는 Dockerfile을 사용하라는 의미이고, 마지막에 점(.)을 꼭 찍어야한다.
STEP 4: Docker 컨테이너 실행하기 (붕어빵 굽기)
이미지가 완성되었으니, 이제 이 이미지로 컨테이너를 실행할 차례이다. 터미널에 아래 명령어를 입력한다.
docker run -p 8080:8080 my-spring-app
- docker run: 이미지를 컨테이너로 실행하는 명령어이다.
- -p 8080:8080: 포트 포워딩(Port Forwarding) 설정이다. "내 컴퓨터(Host)의 8080 포트를 컨테이너의 8080 포트와 연결해줘" 라는 의미이다. Spring Boot는 기본적으로 8080 포트를 사용하므로 이렇게 설정한다.
- my-spring-app: 아까 STEP 3에서 만든 이미지의 이름이다.
명령어를 실행하면 Spring Boot 애플리케이션이 실행될 때의 로그가 터미널에 나타난다.
STEP 5: 실행 확인
웹 브라우저를 열고 주소창에 http://localhost:8080 을 입력해보면 애플리케이션이 정상적으로 보인다면 성공이다!