애플리케이션 빌드: 먼저, Spring Boot 프로젝트를 빌드하여 실행 가능한 JAR 파일을 생성합니다.
./gradlew build
# build/libs/your-app-name-0.0.1-SNAPSHOT.jar 파일 생성 확인
Dockerfile 작성: 프로젝트의 루트 디렉토리에 도커 이미지를 만들기 위한 설계도(Dockerfile)를 작성합니다.
# 1. 베이스 이미지 선택: Java 17 환경이 설치된 경량 리눅스 이미지
FROM openjdk:17-jdk-slim
# 2. JAR 파일이 복사될 컨테이너 내 경로를 인자로 받음
ARG JAR_FILE_PATH=build/libs/*.jar
# 3. 호스트의 JAR 파일을 컨테이너의 app.jar 라는 이름으로 복사
COPY ${JAR_FILE_PATH} app.jar
# 4. 컨테이너가 시작될 때 실행할 명령어 설정
ENTRYPOINT ["java", "-jar", "/app.jar"]
ENTRYPOINT vs CMD: CMD는 컨테이너 실행 시 다른 명령어로 쉽게 덮어쓸 수 있는 기본값인 반면, ENTRYPOINT는 컨테이너의 주 실행 명령어로 고정되어 더 안정적입니다.도커 이미지 빌드: Dockerfile이 있는 위치에서 docker build 명령어를 실행하여 이미지를 생성합니다.
# -t 옵션: 이미지에 이름과 태그(버전)를 부여 (이름:태그)
# . (점): 현재 디렉토리의 Dockerfile을 사용하라는 의미
docker build -t my-spring-app:0.0.1 .
도커 컨테이너 실행: 생성된 이미지를 docker run 명령어로 실행하여 컨테이너를 띄웁니다.
# -d: 백그라운드에서 실행
# -p 8080:8080: 호스트의 8080 포트와 컨테이너의 8080 포트를 연결(매핑)
# --name: 컨테이너에 이름 부여
docker run -d -p 8080:8080 --name my-spring-container my-spring-app:0.0.1
문제점: 현대적인 애플리케이션은 대부분 웹 서버, 데이터베이스, 캐시 서버 등 여러 개의 컨테이너가 함께 동작해야 합니다. 이 컨테이너들을 docker run 명령어로 하나씩 수동으로 실행하고, 서로 네트워크로 연결하며, 환경 변수를 주입하는 것은 매우 번거롭고 실수가 발생하기 쉽습니다.
도커 컴포즈(Docker Compose)는 여러 개의 컨테이너로 구성된 애플리케이션을 하나의 YAML 파일로 정의하고, 단 하나의 명령어로 실행, 중지, 관리할 수 있게 해주는 도구입니다.
docker-compose.yml 파일의 핵심 구조docker-compose.yml 파일은 멀티 컨테이너 애플리케이션의 전체 설계도 역할을 합니다.| 키워드 | 설명 |
|---|---|
version | 사용할 도커 컴포즈 파일의 버전을 명시합니다. (e.g., '3.8') |
services | 실행할 컨테이너들의 목록을 정의하는 최상위 키입니다. 각 서비스가 하나의 컨테이너에 해당합니다. |
image | 컨테이너를 생성할 때 사용할 도커 이미지를 지정합니다. (e.g., mariadb:10.5) |
build | 이미지를 직접 빌드할 경우, Dockerfile이 있는 경로를 지정합니다. (image와 build 중 하나만 사용) |
container_name | 컨테이너의 이름을 지정합니다. |
ports | 호스트와 컨테이너 간의 포트를 매핑합니다. (HOST:CONTAINER) |
environment | 컨테이너 내부에 설정할 환경 변수를 정의합니다. (e.g., DB 비밀번호) |
volumes | 호스트의 디렉토리와 컨테이너의 디렉토리를 연결(마운트)하여 데이터를 영속적으로 저장합니다. 컨테이너가 삭제되어도 데이터가 유지됩니다. |
depends_on | 서비스 간의 실행 순서를 정의합니다. (e.g., spring-app은 db가 먼저 실행된 후에 시작) |
networks | 컨테이너들이 속할 가상 네트워크를 정의합니다. 같은 네트워크에 속한 컨테이너들은 서비스 이름으로 서로를 호출할 수 있습니다. |
docker-compose.yml 예시version: '3.8'
services:
# MariaDB 데이터베이스 서비스 정의
db:
image: mariadb:10.5
container_name: my-mariadb
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- ./db-data:/var/lib/mysql # 호스트의 ./db-data와 컨테이너의 mysql 데이터 디렉토리 연결
networks:
- my-network
# Spring Boot 애플리케이션 서비스 정의
spring-app:
build: . # 현재 디렉토리의 Dockerfile로 이미지 빌드
container_name: my-spring-app
ports:
- "8080:8080"
environment:
# 중요: 'db'라는 서비스 이름으로 DB에 접근
DB_HOST: db
DB_USERNAME: myuser
DB_PASSWORD: mypassword
depends_on:
- db # db 서비스가 먼저 시작되어야 함
networks:
- my-network
networks:
my-network:
driver: bridge
docker-compose up: docker-compose.yml 파일을 읽어 모든 서비스를 생성하고 시작합니다. (-d 옵션으로 백그라운드 실행)docker-compose down: 모든 서비스를 중지하고 컨테이너, 네트워크를 제거합니다. (-v 옵션으로 볼륨까지 제거)docker-compose ps: 현재 실행 중인 서비스들의 상태를 확인합니다.Dockerfile을 통해 도커 이미지로 만드는 과정입니다.docker-compose.yml이라는 하나의 설정 파일을 사용하여, 여러 개의 컨테이너로 구성된 애플리케이션의 전체 스택(e.g., 웹 서버 + DB)을 한 번에 관리하는 강력한 도구입니다.db)으로 서로를 쉽게 참조할 수 있습니다.