Day 70 - Docker pt.2

haxxru log;·2026년 7월 6일
post-thumbnail

이 글은 2026년 07월 01일 작성된 글입니다.

Docker를 학습하며 이미지 빌드, 레이어와 캐시, 데이터베이스 컨테이너, Spring Boot 배포, 멀티 스테이지 빌드까지 학습했다. 특히 Docker를 이용한 실제 배포 환경과 이미지 최적화 방법을 중심으로 정리했다.


1. Docker 이미지와 캐시

Docker 이미지는 여러 개의 레이어(Layer)로 구성되며, 각 레이어는 변경할 수 없는(Immutable) 구조를 가진다.

핵심

  • Dockerfile의 명령어마다 새로운 레이어 생성
  • 변경되지 않은 레이어는 캐시 재사용
  • 변경된 레이어 이후는 다시 빌드
  • 자주 변경되는 내용은 아래쪽에 배치
FROM nginx:latest
COPY source/web /web
RUN apt-get update

2. 여러 사이트를 포함한 이미지 생성

하나의 Nginx 이미지에서 여러 사이트를 동시에 서비스할 수 있다.

핵심

  • 하나의 이미지에 site1, site2, site3 포함
  • 여러 포트를 각각 다른 사이트에 연결
  • 설정 변경 후 이미지 재빌드
COPY source/web /web
COPY vhost.conf /etc/nginx/conf.d/

3. docker history

이미지가 어떤 레이어로 만들어졌는지 확인할 수 있다.

핵심

  • 레이어 확인
  • 이미지 생성 과정 추적
  • 이미지 최적화 분석
docker history myimage

4. Dockerfile 최적화

Docker는 캐시를 최대한 활용하도록 설계되어 있다.

핵심

  • 변경이 적은 작업은 위쪽
  • 변경이 많은 작업은 아래쪽
  • 캐시 효율 증가
  • 빌드 속도 향상

5. 캐시 동작 방식

중간 단계에서 캐시가 깨지면 이후 단계도 모두 새로 실행된다.

핵심

  • 특정 레이어 변경
  • 이후 레이어 전부 재빌드
  • Dockerfile 순서가 중요

6. 캐시 비활성화

캐시 없이 새롭게 이미지를 빌드할 수 있다.

핵심

  • 모든 단계 새로 실행
  • 테스트 시 유용
docker build --no-cache .

7. Oracle, PostgreSQL, Redis 컨테이너

Docker로 다양한 데이터베이스를 쉽게 실행할 수 있다.

핵심

  • Oracle 11g
  • PostgreSQL
  • Redis
  • 포트와 볼륨 설정
  • DBeaver 연동 가능
docker run -p 5432:5432 postgres

8. Redis 특징

Redis는 메모리 기반 Key-Value 데이터베이스이다.

핵심

  • 캐시 서버
  • 세션 저장
  • 메시지 큐
  • 매우 빠른 조회 속도

9. Java 컴파일과 JAR 실행

컨테이너에서도 Java를 직접 컴파일하고 실행할 수 있다.

핵심

  • javac 컴파일
  • jar 생성
  • java -jar 실행
javac Main.java
java Main
java -jar app.jar

10. Gradle 빌드

Gradle을 이용하면 프로젝트를 자동으로 빌드할 수 있다.

핵심

  • 의존성 관리
  • JAR 생성
  • 자동 빌드
gradle build

11. Spring Boot 실행

Gradle 컨테이너에서 Spring 프로젝트를 빌드하고 실행할 수 있다.

핵심

  • Git Clone
  • Gradle Build
  • JAR 실행
  • 포트 매핑
java -jar app.jar

12. 빌드 서버와 운영 서버 분리

빌드는 빌드 서버에서, 실행은 운영 서버에서 수행하는 것이 일반적이다.

핵심

  • 역할 분리
  • 운영 서버 경량화
  • 보안 향상
  • 성능 향상

13. docker cp · 바인드 마운트 · 볼륨

빌드 결과물을 운영 서버로 전달하는 여러 방법을 학습했다.

핵심

  • docker cp
  • Bind Mount
  • Docker Volume
  • JAR 공유

14. 실행 전용 Docker 이미지

빌드된 JAR만 포함하는 이미지를 만들면 어디서든 실행 가능하다.

핵심

  • GraalVM 기반
  • JAR 포함
  • 즉시 실행 가능
FROM graalvm:21

COPY app.jar /app/app.jar

ENTRYPOINT ["java","-jar","/app/app.jar"]

15. 멀티 스테이지 빌드

빌드와 실행 환경을 하나의 Dockerfile에서 관리할 수 있다.

핵심

  • Build Stage
  • Runtime Stage
  • 빌드 도구 제거
  • 이미지 크기 감소
FROM gradle AS builder

RUN gradle build

FROM graalvm

COPY --from=builder ...

빌드 흐름

소스코드
    ↓
Build Stage
    ↓
JAR 생성
    ↓
Runtime Stage
    ↓
최종 이미지

16. 멀티 스테이지 장점

복잡했던 배포 과정을 Dockerfile 하나로 단순화할 수 있다.

핵심

  • docker cp 불필요
  • 별도 빌드 컨테이너 불필요
  • Dockerfile 하나로 빌드
  • 운영 이미지 최소화

✅ 정리

  • Docker 이미지는 여러 개의 레이어로 구성되며 변경되지 않은 레이어는 캐시를 재사용한다.
  • Dockerfile은 변경이 적은 명령을 위쪽에 배치할수록 빌드 속도를 높일 수 있다.
  • docker history를 통해 이미지의 레이어 구조를 확인하고 최적화할 수 있다.
  • Oracle, PostgreSQL, Redis를 Docker 컨테이너로 손쉽게 구축하고 개발 환경에서 활용할 수 있다.
  • Gradle을 이용해 Spring Boot 프로젝트를 빌드하고 JAR 파일을 생성할 수 있다.
  • 빌드 서버와 운영 서버를 분리하면 보안과 성능 측면에서 유리하다.
  • docker cp, 바인드 마운트, Docker Volume을 이용해 빌드 결과물을 다양한 방식으로 공유할 수 있다.
  • 실행에 필요한 JAR만 포함한 Docker 이미지를 만들면 어디서든 동일한 환경에서 실행할 수 있다.
  • 멀티 스테이지 빌드를 사용하면 빌드와 실행 환경을 하나의 Dockerfile로 관리하면서 이미지 크기와 배포 과정을 모두 최적화할 수 있다.

0개의 댓글