
이 글은 2026년 07월 01일 작성된 글입니다.
Docker를 학습하며 이미지 빌드, 레이어와 캐시, 데이터베이스 컨테이너, Spring Boot 배포, 멀티 스테이지 빌드까지 학습했다. 특히 Docker를 이용한 실제 배포 환경과 이미지 최적화 방법을 중심으로 정리했다.
Docker 이미지는 여러 개의 레이어(Layer)로 구성되며, 각 레이어는 변경할 수 없는(Immutable) 구조를 가진다.
FROM nginx:latest
COPY source/web /web
RUN apt-get update
하나의 Nginx 이미지에서 여러 사이트를 동시에 서비스할 수 있다.
COPY source/web /web
COPY vhost.conf /etc/nginx/conf.d/
이미지가 어떤 레이어로 만들어졌는지 확인할 수 있다.
docker history myimage
Docker는 캐시를 최대한 활용하도록 설계되어 있다.
중간 단계에서 캐시가 깨지면 이후 단계도 모두 새로 실행된다.
캐시 없이 새롭게 이미지를 빌드할 수 있다.
docker build --no-cache .
Docker로 다양한 데이터베이스를 쉽게 실행할 수 있다.
docker run -p 5432:5432 postgres
Redis는 메모리 기반 Key-Value 데이터베이스이다.
컨테이너에서도 Java를 직접 컴파일하고 실행할 수 있다.
javac Main.java
java Main
java -jar app.jar
Gradle을 이용하면 프로젝트를 자동으로 빌드할 수 있다.
gradle build
Gradle 컨테이너에서 Spring 프로젝트를 빌드하고 실행할 수 있다.
java -jar app.jar
빌드는 빌드 서버에서, 실행은 운영 서버에서 수행하는 것이 일반적이다.
빌드 결과물을 운영 서버로 전달하는 여러 방법을 학습했다.
빌드된 JAR만 포함하는 이미지를 만들면 어디서든 실행 가능하다.
FROM graalvm:21
COPY app.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]
빌드와 실행 환경을 하나의 Dockerfile에서 관리할 수 있다.
FROM gradle AS builder
RUN gradle build
FROM graalvm
COPY --from=builder ...
소스코드
↓
Build Stage
↓
JAR 생성
↓
Runtime Stage
↓
최종 이미지
복잡했던 배포 과정을 Dockerfile 하나로 단순화할 수 있다.
docker history를 통해 이미지의 레이어 구조를 확인하고 최적화할 수 있다.docker cp, 바인드 마운트, Docker Volume을 이용해 빌드 결과물을 다양한 방식으로 공유할 수 있다.