Image and Container
실행 환경을 담은 이미지는 정적인 설계도이며, 컨테이너는 이 설계도를 기반으로 격리된 환경에서 돌아가는 동적인 프로세스다.
이미지(Image)
섹션 제목: “이미지(Image)”애플리케이션 실행에 필요한 모든 파일과 설정값을 포함하고 있는 읽기 전용(Read-Only) 템플릿이다.
레이어 구조와 Union File System
섹션 제목: “레이어 구조와 Union File System”도커 이미지는 여러 개의 레이어가 쌓인 구조로, Union File System 기술을 통해 여러 레이어를 하나의 통합된 파일 시스템으로 보이게 한다.
- Dockerfile의 각 명령어(RUN, COPY, ADD 등)로 새로운 레이어 생성
- 변경되지 않은 레이어는 재사용하는 레이어 캐싱을 통해 빌드 속도 향상 및 스토리지 절약
- 한 번 생성된 이미지 레이어는 절대 변하지 않는 불변성(Immutability)을 가짐
이미지 태그 관리 전략
섹션 제목: “이미지 태그 관리 전략”이미지는 이름과 태그를 통해 버전을 관리하며, 운영 환경의 안정성을 위해 적절한 태그 전략이 필요하다.
- latest 태그: 명시적 태그가 없을 때 기본 적용되나, 시점에 따라 가리키는 이미지가 달라지므로 운영 환경에서는 권장되지 않음
- 권장 전략: 시맨틱 버저닝(v1.2.3)을 사용하여 의미 있는 버전을 부여하거나, Git 커밋 해시를 사용하여 배포 시점의 소스 코드를 정확히 추적
컨테이너(Container)
섹션 제목: “컨테이너(Container)”이미지를 실행한 상태로, 호스트 OS의 커널을 공유하면서 프로세스 단위로 격리된 인스턴스다.
쓰기 가능 레이어(Writable Layer)
섹션 제목: “쓰기 가능 레이어(Writable Layer)”컨테이너는 이미지 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 얹은 형태다.
- 컨테이너 내의 파일 수정이나 로그 생성은 최상단의 쓰기 가능 레이어에서만 발생
- 아래의 이미지 레이어는 여전히 읽기 전용 상태 유지(Copy-on-Write 방식)
- 컨테이너가 삭제되면 쓰기 가능 레이어의 데이터도 휘발되므로, 영구 저장이 필요한 데이터는 볼륨 사용
컨테이너 격리의 핵심 기술
섹션 제목: “컨테이너 격리의 핵심 기술”도커는 리눅스 커널의 두 가지 핵심 기능을 활용하여 컨테이너를 격리한다.
- Namespaces(네임스페이스): 프로세스별 가상 공간 분리
- PID: 프로세스 번호 격리
- NET: 네트워크 인터페이스 및 IP 주소 격리
- MNT: 파일 시스템 마운트 포인트 격리
- Control Groups(cgroups): 하드웨어 자원 제한
- CPU 점유율 제한 및 메모리 할당량 설정
- 특정 컨테이너가 호스트의 모든 자원을 점유하는 현상 방지
이미지 최적화
섹션 제목: “이미지 최적화”이미지 크기를 줄이는 것은 네트워크 전송 비용 절감과 빠른 배포, 보안성 강화에 필수적이다.
멀티 스테이지 빌드(Multi-stage Build)
섹션 제목: “멀티 스테이지 빌드(Multi-stage Build)”빌드 시에만 필요한 도구(컴파일러, 빌드 라이브러리)와 실제 실행에 필요한 결과물을 분리하는 기술이다.
# 1단계: 빌드 스테이지FROM maven:3.8-openjdk-17 AS buildCOPY . /appRUN mvn -f /app/pom.xml clean package
# 2단계: 실행 스테이지FROM openjdk:17-jdk-slimCOPY --from=build /app/target/app.jar /app.jarENTRYPOINT ["java", "-jar", "/app.jar"]그 외 최적화 기법
섹션 제목: “그 외 최적화 기법”- 경량 베이스 이미지:
alpine이나distroless이미지를 사용하여 공격 표면과 이미지 크기 최소화 - 레이어 결합:
RUN apt-get update && apt-get install -y ...와 같이 관련 명령어를 묶어 레이어 수 감소 .dockerignore: 빌드와 무관한.git, 테스트 코드, 로컬 설정 파일 등이 이미지에 포함되지 않도록 설정