본문 바로가기
Infra/Docker & Kubernetes

컨테이너란? 개발자라면 꼭 알아야 할 기초 개념

by 워니 wony 2025. 5. 29.

컨테이너란?

  • 애플리케이션과 실행 환경, 필요한 모든 요소(라이브러리, 설정, 종속 항목 등)를 하나의 런타임 환경으로 패키징하여, 어디서든 일관된 실행 환경을 제공하는 기술
    • 애플리케이션과 종속 항복을 하나로 묶어 실행하게 해주는 운영 시스템을 가상화한 경량읭 격리된 프로세스
  • 쉽게 말해 프로그램과 그에 필요한 모든 것을 한 박스에 포장해서 어디서든 실행할 수 있게 해주는 기술

특징

  • 경량화된 가상화 방식
    • 기존의 가상 머신(VM) 과 유사하나 컨테이너는 전체 운영체제를 포함하지 않음
    • 호스트 OS의 커널을 공유하므로 훨씬 가볍고 실행 속도 빠름
    • 개발한 최소한의 Image를 통해 실행되어 경량
  • 격리된 실행 환경
    • 하나의 시스템 내에서 여러 개의 컨테이너를 실행해도 서로 영향을 주지 않으며, 독립적으로 동작
    • 독립성을 갖기 때문에 다른 컨테이너에 영향을 주지 않는 stateless 환경 제공
  • 이식성과 재현성
    • 한 환경에서 개발한 애플리케이션을 다른 환경(테스트, 운영 등)에서도 동일하게 실행 가능

 

많이 사용하는 이유

  • 일관된 실행 환경 제공으로 인해 개발과 운영 환경이 달라 운영 배포 시에만 문제가 발생하는 현상 해결
    • 로컬 개발, 테스트 서버, 운영 서버 어디서나 똑같이 실행!
  • 가볍고 빠름
    • 기존 가상 머신은 운영체제도 띄워야 해서 무겁고 느리지만, 컨테이너는 운영체제 공유함
    • 애플리케이션만 따로 돌리기 때문에 시작이 빠르고 리소스 적게 사용
  • 작게 나눠서 관리 가능
    • 하나의 큰 프로그램 여러 개 작은 컨테이너로 나눠서 띄울 수 있음 (MSA)
    • 유지 보수 확장에 유리
  • 자동화에 적합
    • 컨테이너는 코드처럼 다룰 수 있어 자동 배포(CI/CD) 적합
  • 클라우드에 적합
    • AWS 등 클라우드 서비스들이 컨테이너 기반 배포에 최적화
    • Kubernetes 같은 도구로 수천 개의 컨테이너를 쉽게 관리 가능
  • 격리성으로 인해 확장 용이, 유영한 환경
    • 독립적인 실행 환경을 가지고있어서 다른 컨테이너에 영향 주지 않음
    • 서버가 죽어도 다른 서버가 대신 처리 가능
    • 서버를 늘려야 하면 컨테이너 복제해서 여러개로 만들기 가능
    • 상태를 저장하지 않기 때문에 마음껏 늘리고, 줄이고 교체 가능

컨테이너 기술을 사용하면 서버구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발에 집중 가능하다. 위와 같은 이점으로 인해 요즘 기업에서 많이 사용중이다.

 

컨테이너 사용 사례

  • 대규모 애플리케이션 서비스부터 앱 서비스까지 여러 기업에서 사용중
    • 구글 웹,앱 서비스 : 일주일에 컨데이터 업다운 컨테이너 갯수가 20억개
    • 에어비앤비 추천 서비스
    • 넷플릭스 추천 서비스
    • 당근마켓 딥러닝 기반 추천 서비스 : 개인화 추천 서비스 활용 중
    • 토스 금융 서비스

 

컨테이너 생성 타입

  • 컨테이너 패키징 메커니즘
    • 시스템
    • 애플리케이션
    • 라우터 컨테이너
  • 시스템(or OS) 컨테이너
    • 호스트 OS 위에 우분투와 같은 배포판 리눅스 이미지를 통해 배포되는 컨테이너
    • 또다른 VM 형태, 내부에 다양한 애플리케이션 및 라이브러리 도구를 설치, 실행 가능
    • 대표적으로 LXC, LXD, OpenVZ 등이 있음
  • 애플리케이션
    • 도커의 주 역할, 애플리케이션 컨테이너를 돌리는 것
    • 단일 애플리케이션 실행을 위해 해당 서비스를 패키징하고 실행하도록 설계된 컨테이너
      • PID 1번을 OS가 아닌 해당 애플리케이션이 1번을 잡고 있음
        • Nginx container, java container, MySQL container
    • 3-tier 애플리케이션과 같은 경우 각 tier (frontend-backend-DB)를 개별 컨테이너로 실행하여 연결
      1. Frontend → 웹 UI (React, Vue 등)
      2. Backend → 서버 로직 (Node.js, Spring 등)
      3. Database → 데이터 저장소 (MySQL, PostgreSQL 등)
      • 각 계층을 개별 컨테이너로 실행하고, 네트워크로 연결
    • 대표적으로 Docker container runtime 등이 있음

 

컨테이너 이미지란?

  • 컨테이너를 실행하는 데 필요한 모든 코드, 라이브러리, 종속성, 설정 파일 등을 포함한 불변 패키지
  • 컨테이너 이미지 생성의 Best Practice 중 하나는 이미지 경량화
  • 특징
    • 불변성: 이미지 자체는 변경되지 않으며, 언제 어디서 실행해도 동일하게 동작
    • 레이어 구조: 여러 개의 파일 시스템 레이어로 구성되어 효율적, 중복된 부분 캐싱되어 빠르게 배포 가능
    • 이식성: 다양한 운영체제와 환경에서 동일하게 실행할 수 있도록 만들어져 있음
    • 버전 관리 용이성: tag 통해 다양한 버전의 이미지 관리 가능
  • 컨테이너 이미지는 실행 전 만들어진 ‘정적인 템플릿’
    • 이미지로 부터 생성된 ‘실행 중인 인스턴스’가 컨테이너!
반응형

댓글