
이전에는 Docker 이미지를 생성(docker build -t <도커계정 이름>/<이미지 이름> <파일경로>), 컨테이너 생성(docker run --name <사용할 컨테이너 이름> -d -p 8080:8080 <도커계정 이름>/<이미지 이름>), 네트워크 생성(docker network create <네트워크이름>), 네트워크 연결(docker network connect <네트워크 이름> <컨테이너 이름>) 등의 작업을 일일히 수행하는 번거로움이 있었다.
Docker Compose는 이러한 과정들을 docker-compose.yml파일에 정의해 효율적으로 관리할 수 있도록 해준다.
프로젝트의 루트 디렉토리에 Dockerfile을 작성하고, 빌드 폴더 디렉토리의 JAR 파일을 복사하도록 한다.
# 1. OpenJDK 기반 이미지 사용
FROM openjdk:17
# 2. JAR 파일 복사
# 빌드된 JAR 파일을 컨테이너로 복사합니다.
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
# 3. 애플리케이션 실행 명령
ENTRYPOINT ["java", "-jar", "/app.jar"]
프로젝트의 루트 디렉토리에 docker-compose.yml을 작성하고, Docker와 관련된 작업들을 정의한다.
버전
version: "4": Docker Compose의 버전을 지정.서비스
database: MariaDB를 실행하는 컨테이너.mariadb 공식 이미지 사용.mariadb-data) 사용.MARIADB_ROOT_PASSWORD: MariaDB 관리자 비밀번호.MARIADB_DATABASE: 초기 생성할 데이터베이스 이름.app: Spring Boot 애플리케이션 실행 컨테이너.database)와 연결.네트워크
my-network: 두 컨테이너가 통신할 수 있도록 연결하는 네트워크.볼륨
mariadb-data: MariaDB 데이터를 저장해 컨테이너가 재시작되어도 데이터 유지.version: "4" # Docker Compose 버전
services:
database: # MariaDB 컨테이너 설정
image: mariadb
container_name: my-mariadb # MariaDB 컨테이너 이름
ports:
- "3307:3306" # 외부 포트 3307을 컨테이너 포트 3306에 연결
environment:
MARIADB_ROOT_PASSWORD: <DB 비밀번호> # MariaDB root 비밀번호
MARIADB_DATABASE: <DB 테이블 이름> # 기본 생성할 데이터베이스 이름
networks:
- my-network # 사용자 정의 네트워크에 연결
restart: always # MariaDB가 중단되면 자동으로 재시작
volumes:
- mariadb-data:/var/lib/mysql # 데이터를 컨테이너 외부에 유지
app: # Spring Boot 애플리케이션 컨테이너 설정
build: # Dockerfile을 사용해 이미지 빌드
context: . # 현재 디렉토리를 빌드 컨텍스트로 사용
dockerfile: Dockerfile # 사용할 Dockerfile
container_name: my-app # Spring Boot 컨테이너 이름
ports:
- "8080:8080" # 외부 포트 8080을 컨테이너 포트 8080에 연결
networks:
- my-network # 사용자 정의 네트워크에 연결
depends_on:
- database
restart: always # Spring Boot가 중단되면 자동으로 재시작
networks:
my-network: # 사용자 정의 네트워크 설정
driver: bridge
volumes:
mariadb-data: # 데이터 유지용 볼륨
JAR 파일은 build/libs 경로에 빌드가 되어있는 상태라고 가정하고 진행.
CMD를 실행시키고 docker-compose.yml이 있는 경로로 이동한다.

docker-compose up --build -d를 통해서 docker-compose.yml에 정의해놓은 이미지를 기반으로 컨테이너를 실행시키는 등의 작업을 수행한다.
