컨테이너 기술

지원 버전: Docker 20.10+, containerd 1.6+, CRI-O 1.24+ 마지막 업데이트: 2026년 2월 23일

컨테이너는 애플리케이션과 그 종속성을 함께 패키징하여 다양한 환경에서 일관되게 실행할 수 있게 해주는 기술입니다. 이 문서에서는 컨테이너의 기본 개념, 작동 원리, 그리고 Kubernetes와의 관계에 대해 설명합니다.

목차

컨테이너란?

컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정)을 포함하는 표준화된 소프트웨어 유닛입니다. 컨테이너는 호스트 운영체제의 커널을 공유하면서도 서로 격리된 환경에서 실행됩니다.

컨테이너의 주요 특징

  1. 이식성: 개발, 테스트, 프로덕션 환경 간에 일관된 실행 환경 제공

  2. 경량성: 가상 머신보다 적은 리소스 사용

  3. 격리: 다른 컨테이너 및 호스트 시스템과 격리된 실행 환경

  4. 신속한 시작 및 종료: 밀리초 단위의 빠른 시작 시간

  5. 확장성: 쉽게 복제하여 수평적 확장 가능

  6. 버전 관리: 이미지 버전 관리를 통한 애플리케이션 라이프사이클 관리

컨테이너 기술의 역사

  • 2000년대 초: Linux VServer, OpenVZ 등의 초기 컨테이너 기술 등장

  • 2007년: cgroups(Control Groups)가 Linux 커널에 통합

  • 2008년: LXC(Linux Containers) 프로젝트 시작

  • 2013년: Docker 출시, 컨테이너 기술 대중화

  • 2015년: Open Container Initiative(OCI) 설립, 컨테이너 표준화

  • 2017년: containerd가 CNCF 프로젝트로 기부됨

컨테이너 vs 가상 머신

가상 머신 아키텍처 vs 컨테이너 아키텍쳐

가상 머신 아키텍처 vs 컨테이너 아키텍쳐

주요 차이점

특성
컨테이너
가상 머신

크기

일반적으로 수십 MB

일반적으로 수 GB

시작 시간

초 단위 또는 그 이하

분 단위

격리 수준

프로세스 수준 격리

하드웨어 수준 격리

OS

호스트 OS 커널 공유

각 VM마다 전체 OS 필요

성능

거의 네이티브

약간의 오버헤드

보안

상대적으로 낮음 (공유 커널)

상대적으로 높음 (완전 격리)

리소스 효율성

높음

중간

사용 사례

마이크로서비스, CI/CD, 개발/테스트

레거시 앱, 다양한 OS 요구사항, 높은 보안 요구

컨테이너의 기술적 기반

컨테이너는 Linux 커널의 여러 기능을 활용하여 구현됩니다. 이러한 기술들은 01-linux-basics.md에서 상세히 다루었으며, 여기서는 컨테이너와의 관계를 중심으로 설명합니다.

네임스페이스를 통한 격리

컨테이너는 Linux 네임스페이스를 사용하여 프로세스를 격리합니다. 각 컨테이너는 고유한 네임스페이스 집합을 가지며, 이를 통해 독립적인 실행 환경을 제공받습니다.

컨테이너가 사용하는 네임스페이스:

  • PID: 컨테이너는 자신만의 프로세스 트리를 가짐 (PID 1부터 시작)

  • Network: 독립적인 네트워크 스택 (IP 주소, 라우팅 테이블, 포트)

  • Mount: 독립적인 파일 시스템 뷰

  • UTS: 독립적인 호스트네임

  • IPC: 독립적인 프로세스 간 통신 공간

  • User: 독립적인 사용자 ID 매핑 (선택적)

cgroups를 통한 리소스 제한

컨테이너는 cgroups를 사용하여 리소스 사용량을 제한하고 모니터링합니다.

컨테이너가 사용하는 cgroup 리소스 제어:

  • CPU: CPU 시간 제한 및 CPU 코어 할당

  • Memory: 메모리 사용량 제한 및 OOM 동작 제어

  • Block I/O: 디스크 I/O 대역폭 제한

  • Network: 네트워크 대역폭 제한 (tc와 결합)

  • PIDs: 컨테이너 내 프로세스 수 제한

OverlayFS를 통한 레이어 관리

컨테이너 이미지는 OverlayFS를 사용하여 여러 레이어를 효율적으로 관리합니다.

OverlayFS 구조:

  • LowerDir: 읽기 전용 이미지 레이어들 (하위 레이어 → 상위 레이어)

  • UpperDir: 읽기/쓰기 가능한 컨테이너 레이어

  • WorkDir: OverlayFS 작업 디렉토리

  • MergedDir: 통합된 뷰 (컨테이너가 보는 파일 시스템)

실습: 컨테이너의 기술적 기반 이해하기

컨테이너 런타임

컨테이너 런타임은 컨테이너의 생명주기를 관리하는 소프트웨어입니다. 컨테이너 이미지를 실행하고, 컨테이너의 리소스 사용을 제한하며, 네트워킹과 스토리지를 설정합니다.

컨테이너 런타임 계층 구조

  1. 저수준 런타임 (OCI 호환)

    • runc: Docker의 기본 런타임, OCI 표준 구현체

    • crun: C로 작성된 경량 OCI 런타임

    • kata-containers: 하드웨어 가상화를 사용한 보안 강화 런타임

    • gVisor: 사용자 공간에서 커널 기능을 에뮬레이션하는 보안 런타임

  2. 고수준 런타임

    • containerd: Docker에서 분리된 산업 표준 컨테이너 런타임

    • CRI-O: Kubernetes를 위해 특별히 설계된 경량 런타임

    • Docker Engine: 가장 널리 사용되는 컨테이너 플랫폼

Kubernetes의 컨테이너 런타임 인터페이스 (CRI)

Kubernetes는 CRI(Container Runtime Interface)를 통해 다양한 컨테이너 런타임과 통합됩니다. CRI는 Kubernetes와 컨테이너 런타임 사이의 표준화된 인터페이스를 제공합니다.

Kubernetes CRI

컨테이너 이미지

컨테이너 이미지는 애플리케이션과 그 종속성을 포함하는 불변의 템플릿입니다. 이미지는 여러 레이어로 구성되며, 각 레이어는 파일 시스템의 변경사항을 나타냅니다.

이미지 레이어

컨테이너 이미지는 여러 레이어의 스택으로 구성됩니다. 각 레이어는 이전 레이어에 대한 변경사항을 나타냅니다. 이 레이어 방식은 이미지 공유와 캐싱을 효율적으로 만듭니다.

컨테이너 레이어
spinner

이미지 레지스트리

컨테이너 이미지는 레지스트리에 저장되고 공유됩니다. 주요 레지스트리는 다음과 같습니다:

  • Docker Hub: 가장 큰 공개 레지스트리

  • Amazon ECR: AWS의 컨테이너 레지스트리 서비스

  • Google Container Registry: Google Cloud의 레지스트리

  • Azure Container Registry: Microsoft Azure의 레지스트리

  • GitHub Container Registry: GitHub의 컨테이너 레지스트리

  • Harbor: 오픈소스 엔터프라이즈급 레지스트리

이미지 태그와 다이제스트

  • 태그: 이미지의 특정 버전을 식별하는 사람이 읽을 수 있는 이름 (예: nginx:1.21.0)

  • 다이제스트: 이미지 내용의 SHA256 해시로, 이미지의 고유한 식별자 (예: nginx@sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767)

Dockerfile

Dockerfile은 컨테이너 이미지를 빌드하기 위한 지시사항을 포함하는 텍스트 파일입니다. 각 지시문은 이미지에 새로운 레이어를 추가합니다.

주요 Dockerfile 지시문

다단계 빌드

다단계 빌드는 최종 이미지 크기를 줄이기 위해 여러 빌드 단계를 사용하는 기법입니다.

이미지 최적화 기법

  1. 적절한 기본 이미지 선택: Alpine과 같은 경량 이미지 사용

  2. 다단계 빌드 사용: 빌드 도구와 중간 파일 제외

  3. 레이어 최소화: RUN, COPY 등의 명령을 결합

  4. 불필요한 파일 제외: .dockerignore 파일 사용

  5. 캐시 활용: 자주 변경되는 레이어를 나중에 배치

컨테이너 네트워킹

컨테이너 네트워킹은 컨테이너 간, 그리고 컨테이너와 외부 세계 간의 통신을 가능하게 합니다.

네트워크 드라이버

Docker는 다양한 네트워크 드라이버를 제공합니다:

  1. bridge: 기본 네트워크 드라이버, 동일한 호스트의 컨테이너 간 통신

  2. host: 호스트 네트워크를 직접 사용, 격리 없음

  3. overlay: 다중 호스트 간 컨테이너 통신

  4. macvlan: 컨테이너에 MAC 주소 할당, 물리 네트워크 장치처럼 보이게 함

  5. none: 모든 네트워킹 비활성화

포트 매핑

컨테이너의 내부 포트를 호스트의 포트에 매핑하여 외부에서 접근 가능하게 합니다.

컨테이너 간 통신

  1. 동일 네트워크: 같은 네트워크에 있는 컨테이너는 컨테이너 이름으로 통신 가능

  2. 링크: 레거시 방식, 컨테이너 간 직접 링크 설정

  3. 외부 네트워크: 호스트 포트를 통한 통신

컨테이너 스토리지

컨테이너는 기본적으로 상태를 유지하지 않지만, 영구 데이터 저장을 위한 여러 옵션이 있습니다.

스토리지 유형

  1. 임시 스토리지: 컨테이너 내부 파일 시스템, 컨테이너 삭제 시 데이터 손실

  2. 볼륨: Docker가 관리하는 호스트 파일 시스템의 영역

  3. 바인드 마운트: 호스트의 특정 경로를 컨테이너에 마운트

  4. tmpfs 마운트: 메모리에만 데이터 저장, 높은 I/O 성능 필요 시 사용

볼륨 사용 예시

데이터 공유 패턴

  1. 볼륨 공유: 여러 컨테이너가 동일한 볼륨 사용

  2. 데이터 볼륨 컨테이너: 데이터만 포함하는 컨테이너 생성 후 공유

  3. 외부 스토리지 통합: AWS EBS, NFS 등 외부 스토리지 시스템 사용

컨테이너 보안

컨테이너 보안은 이미지, 컨테이너 런타임, 호스트 시스템 등 여러 계층에서 고려해야 합니다.

이미지 보안

  1. 취약점 스캐닝: Trivy, Clair 등의 도구로 이미지 취약점 검사

  2. 신뢰할 수 있는 기본 이미지: 공식 이미지 또는 검증된 이미지 사용

  3. 최소 권한 원칙: 필요한 패키지와 권한만 포함

  4. 이미지 서명: Docker Content Trust 또는 Cosign으로 이미지 서명 및 검증

런타임 보안

  1. 권한 제한: 루트가 아닌 사용자로 컨테이너 실행

  2. 기능(capabilities) 제한: 필요한 Linux 기능만 부여

  3. seccomp 프로필: 시스템 호출 제한

  4. AppArmor/SELinux: 강제적 접근 제어 적용

  5. 읽기 전용 파일 시스템: 가능한 경우 파일 시스템을 읽기 전용으로 마운트

보안 모범 사례

  1. 정기적인 업데이트: 컨테이너 이미지와 호스트 시스템 정기 업데이트

  2. 네트워크 분리: 적절한 네트워크 정책으로 컨테이너 간 통신 제한

  3. 시크릿 관리: 환경 변수 대신 Docker Secrets 또는 외부 시크릿 관리 도구 사용

  4. 리소스 제한: CPU, 메모리 등 리소스 사용량 제한

  5. 모니터링 및 로깅: 컨테이너 활동 모니터링 및 로그 중앙화

컨테이너 라이프사이클 관리

컨테이너의 전체 라이프사이클을 이해하는 것은 효과적인 컨테이너 운영에 필수적입니다.

컨테이너 상태

컨테이너는 여러 상태를 가질 수 있습니다:

  • Created: 컨테이너가 생성되었으나 아직 시작되지 않음

  • Running: 컨테이너가 실행 중

  • Paused: 컨테이너의 모든 프로세스가 일시 중지됨

  • Restarting: 컨테이너가 재시작 중

  • Exited: 컨테이너가 종료됨

  • Dead: 컨테이너 데몬이 제거하려 했지만 실패함

컨테이너 생성 및 실행

컨테이너 제어

컨테이너 로깅 및 모니터링

컨테이너 정리

헬스 체크

컨테이너의 건강 상태를 모니터링하여 자동으로 복구할 수 있습니다.

재시작 정책

컨테이너가 종료될 때 자동으로 재시작하도록 설정할 수 있습니다.

컨테이너 디버깅

컨테이너 오케스트레이션

컨테이너 오케스트레이션은 다수의 컨테이너를 관리하고 조정하는 프로세스입니다. 주요 기능으로는 배포 관리, 확장, 네트워킹, 서비스 검색 등이 있습니다.

주요 오케스트레이션 도구

  1. Kubernetes: 가장 널리 사용되는 컨테이너 오케스트레이션 플랫폼

  2. Docker Swarm: Docker의 내장 오케스트레이션 도구, 간단한 설정

  3. Amazon ECS: AWS의 컨테이너 오케스트레이션 서비스

  4. HashiCorp Nomad: 컨테이너 및 비컨테이너 워크로드 모두 지원

오케스트레이션의 주요 기능

  1. 자동 배포 및 롤백: 선언적 구성을 통한 애플리케이션 배포 관리

  2. 서비스 검색 및 로드 밸런싱: 컨테이너 간 통신 및 부하 분산

  3. 자동 확장: 부하에 따른 컨테이너 수 조정

  4. 자가 복구: 실패한 컨테이너 자동 재시작

  5. 구성 관리: 애플리케이션 구성 및 시크릿 관리

  6. 스토리지 오케스트레이션: 영구 스토리지 관리

  7. 배치 실행: 일회성 작업 및 크론 작업 실행

AWS에서의 컨테이너

AWS는 컨테이너 워크로드를 위한 다양한 서비스를 제공합니다.

Amazon ECS (Elastic Container Service)

AWS의 자체 컨테이너 오케스트레이션 서비스로, EC2 인스턴스 또는 AWS Fargate에서 컨테이너를 실행할 수 있습니다.

주요 특징:

  • AWS 서비스와의 긴밀한 통합

  • 서버리스 컨테이너 실행 (Fargate)

  • 간단한 설정 및 관리

  • 자동 확장 및 로드 밸런싱

Amazon EKS (Elastic Kubernetes Service)

AWS에서 관리하는 Kubernetes 서비스로, 표준 Kubernetes API를 사용하여 AWS 인프라에서 Kubernetes를 실행할 수 있습니다.

주요 특징:

  • 관리형 Kubernetes 컨트롤 플레인

  • 여러 가용 영역에 걸친 고가용성

  • AWS 서비스와의 통합

  • EC2 및 Fargate 지원

AWS Fargate

서버리스 컨테이너 실행 환경으로, 서버를 관리하지 않고도 컨테이너를 실행할 수 있습니다.

주요 특징:

  • 서버 관리 불필요

  • 컨테이너 단위 과금

  • ECS 및 EKS와 통합

  • 보안 격리

Amazon ECR (Elastic Container Registry)

AWS의 관리형 컨테이너 이미지 레지스트리 서비스입니다.

주요 특징:

  • 이미지 취약점 스캐닝

  • IAM과의 통합

  • 이미지 라이프사이클 관리

  • 고가용성 및 확장성

용어집

용어
설명

컨테이너

애플리케이션과 그 종속성을 함께 패키징한 표준화된 소프트웨어 유닛으로, 어디서나 일관되게 실행할 수 있습니다.

이미지

컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿으로, 애플리케이션 코드, 라이브러리, 종속성, 도구 및 기타 파일을 포함합니다.

Dockerfile

컨테이너 이미지를 빌드하기 위한 지시사항이 포함된 텍스트 파일입니다.

레지스트리

컨테이너 이미지를 저장하고 배포하는 저장소입니다. (예: Docker Hub, Amazon ECR)

컨테이너 런타임

컨테이너를 실행하는 소프트웨어입니다. (예: Docker, containerd, CRI-O)

네임스페이스

Linux 커널 기능으로, 프로세스가 시스템의 다른 부분을 볼 수 없도록 격리합니다.

cgroups

Linux 커널 기능으로, 프로세스 그룹의 리소스 사용(CPU, 메모리 등)을 제한하고 모니터링합니다.

레이어

컨테이너 이미지는 여러 레이어로 구성되며, 각 레이어는 Dockerfile의 명령에 해당합니다.

볼륨

컨테이너의 데이터를 영구적으로 저장하기 위한 메커니즘입니다.

오케스트레이션

여러 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 프로세스입니다.

ECS

Amazon Elastic Container Service의 약자로, AWS의 컨테이너 오케스트레이션 서비스입니다.

ECR

Amazon Elastic Container Registry의 약자로, AWS의 컨테이너 이미지 레지스트리 서비스입니다.

Fargate

AWS의 서버리스 컨테이너 실행 환경으로, 인프라 관리 없이 컨테이너를 실행할 수 있습니다.

결론

컨테이너 기술은 애플리케이션 개발 및 배포 방식을 혁신적으로 변화시켰습니다. 이식성, 일관성, 효율성을 제공하여 개발자 생산성을 향상시키고 운영 복잡성을 줄였습니다. Kubernetes와 같은 오케스트레이션 도구와 결합하면 대규모 분산 애플리케이션을 효과적으로 관리할 수 있습니다.

컨테이너의 기본 개념과 작동 원리를 이해하는 것은 현대적인 클라우드 네이티브 애플리케이션을 개발하고 운영하는 데 필수적입니다. 이러한 지식은 Kubernetes를 효과적으로 활용하기 위한 기반이 됩니다.

퀴즈

이 장에서 배운 내용을 테스트하려면 컨테이너 기술 퀴즈를 풀어보세요.

참고 자료

마지막 업데이트