Image and Container(이미지와 컨테이너)

실행 환경을 담은 이미지는 정적인 설계도이며, 컨테이너는 이 설계도를 기반으로 격리된 환경에서 돌아가는 동적인 프로세스다.

이미지(Image)

애플리케이션 실행에 필요한 모든 파일과 설정값을 포함하고 있는 읽기 전용(Read-Only) 템플릿이다.

레이어 구조와 Union File System

도커 이미지는 여러 개의 레이어가 쌓인 구조로, Union File System 기술을 통해 여러 레이어를 하나의 통합된 파일 시스템으로 보이게 한다.

  • Dockerfile의 각 명령어(RUN, COPY, ADD 등)로 새로운 레이어 생성

  • 변경되지 않은 레이어는 재사용하는 레이어 캐싱을 통해 빌드 속도 향상 및 스토리지 절약

  • 한 번 생성된 이미지 레이어는 절대 변하지 않는 불변성(Immutability)을 가짐

이미지 태그 관리 전략

이미지는 이름과 태그를 통해 버전을 관리하며, 운영 환경의 안정성을 위해 적절한 태그 전략이 필요하다.

  • latest 태그: 명시적 태그가 없을 때 기본 적용되나, 시점에 따라 가리키는 이미지가 달라지므로 운영 환경에서는 권장되지 않음

  • 권장 전략: 시맨틱 버저닝(v1.2.3)을 사용하여 의미 있는 버전을 부여하거나, Git 커밋 해시를 사용하여 배포 시점의 소스 코드를 정확히 추적

컨테이너(Container)

이미지를 실행한 상태로, 호스트 OS의 커널을 공유하면서 프로세스 단위로 격리된 인스턴스다.

쓰기 가능 레이어(Writable Layer)

컨테이너는 이미지 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 얹은 형태다.

  • 컨테이너 내의 파일 수정이나 로그 생성은 최상단의 쓰기 가능 레이어에서만 발생

  • 아래의 이미지 레이어는 여전히 읽기 전용 상태 유지(Copy-on-Write 방식)

  • 컨테이너가 삭제되면 쓰기 가능 레이어의 데이터도 휘발되므로, 영구 저장이 필요한 데이터는 볼륨 사용

컨테이너 격리의 핵심 기술

도커는 리눅스 커널의 두 가지 핵심 기능을 활용하여 컨테이너를 격리한다.

  1. Namespaces(네임스페이스): 프로세스별 가상 공간 분리

    • PID: 프로세스 번호 격리

    • NET: 네트워크 인터페이스 및 IP 주소 격리

    • MNT: 파일 시스템 마운트 포인트 격리

  2. Control Groups(cgroups): 하드웨어 자원 제한

    • CPU 점유율 제한 및 메모리 할당량 설정

    • 특정 컨테이너가 호스트의 모든 자원을 점유하는 현상 방지

이미지 최적화

이미지 크기를 줄이는 것은 네트워크 전송 비용 절감과 빠른 배포, 보안성 강화에 필수적이다.

멀티 스테이지 빌드(Multi-stage Build)

빌드 시에만 필요한 도구(컴파일러, 빌드 라이브러리)와 실제 실행에 필요한 결과물을 분리하는 기술이다.

그 외 최적화 기법

  • 경량 베이스 이미지: alpine이나 distroless 이미지를 사용하여 공격 표면과 이미지 크기 최소화

  • 레이어 결합: RUN apt-get update && apt-get install -y ...와 같이 관련 명령어를 묶어 레이어 수 감소

  • .dockerignore: 빌드와 무관한 .git, 테스트 코드, 로컬 설정 파일 등이 이미지에 포함되지 않도록 설정

Last updated