Docker

애플리케이션과 그 실행 환경을 컨테이너라는 격리된 단위로 패키징해 어디서든 동일하게 실행할 수 있게 해주는 플랫폼입니다.

핵심 개념

VM vs 컨테이너

[ VM ]                         [ 컨테이너 ]

┌─────────┬─────────┐          ┌──────┬──────┐
│  App A  │  App B  │          │App A │App B │
├─────────┼─────────┤          ├──────┴──────┤
│Guest OS │Guest OS │          │  컨테이너 런타임  │
├─────────┴─────────┤          ├─────────────┤
│    Hypervisor     │          │    Host OS  │
├───────────────────┤          ├─────────────┤
│     Host OS       │          │  Hardware   │
├───────────────────┤          └─────────────┘
│     Hardware      │
└───────────────────┘
항목VM컨테이너
격리 단위OS 전체프로세스
부팅 시간분 단위초 이내
이미지 크기GBMB
자원 오버헤드높음낮음
OS 공유XO (Host OS 커널 공유)

Dockerfile

FROM eclipse-temurin:21-jdk-alpine      # 베이스 이미지
WORKDIR /app                             # 작업 디렉토리
COPY build/libs/app.jar app.jar          # 파일 복사
EXPOSE 8080                              # 포트 선언 (문서 목적)
ENTRYPOINT ["java", "-jar", "app.jar"]  # 실행 명령

레이어 캐시 활용

# X 소스 변경마다 의존성 재다운로드
COPY . .
RUN ./gradlew build

# O 의존성 레이어 캐시 재사용
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon
COPY src ./src
RUN ./gradlew build

Dockerfile 명령어 순서 = 레이어 순서. 변경 빈도가 낮은 것을 위쪽에 배치해야 캐시 효율이 높아짐.

주요 명령어

# 이미지 빌드
docker build -t my-app:1.0 .

# 컨테이너 실행
docker run -d -p 8080:8080 --name app my-app:1.0

# 실행 중인 컨테이너 목록
docker ps

# 로그 확인
docker logs -f app

# 컨테이너 내부 접속
docker exec -it app /bin/sh

# 이미지 푸시
docker push my-registry/my-app:1.0

Docker Compose

여러 컨테이너를 함께 정의·실행하는 도구. 로컬 개발 환경이나 간단한 멀티 컨테이너 구성에 사용.

services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      - DB_URL=jdbc:postgresql://db:5432/cslog

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=cslog
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

멀티스테이지 빌드

최종 이미지에서 빌드 도구를 제거해 이미지 크기를 줄이는 패턴.

# 1단계: 빌드
FROM gradle:8-jdk21 AS builder
WORKDIR /app
COPY . .
RUN gradle build --no-daemon

# 2단계: 실행 (JDK 없이 JRE만)
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

핵심 정리

→ XaaS | CI/CD

CSLOG에서 보기