Docker - 개념과 역사

Argonaut·2024년 12월 17일
post-thumbnail

0. Docker란 무엇인가?


Docker는 애플리케이션을 컨테이너(Container)라는 독립된 환경에서 실행할 수 있게 해주는 컨테이너 기반 가상화 플랫폼

애플리케이션과 그 실행에 필요한 모든 것을(코드, 라이브러리, 의존성 등) 이미지(Image)라는 형태로 묶어두고 이를 가볍고 빠르게 배포 및 실행


1. Docker가 왜 생겼는가?

Docker가 등장한 배경에는 소프트웨어 개발과 배포의 비효율성 문제를 해결하기 위한 필요에 의해 만들어졌습니다. 특히, 과거 전통적인 환경 구축 방식과 가상화 기술의 한계를 보완하고자 등장했습니다.

  1. 환경 불일치 : 개발 환경과 배포 환경이 다르면 애플리케이션이 실행되지 않거나 문제가 발생
  2. 의존성 문제 : 여러 애플리케이션이 동일한 서버에서 실행될 경우 라이브러리 버전 충돌
  3. 비효율적 가상화 : 기존 가상머신(VM)은 전체 운영체제를 포함하므로 실행 속도가 느리고 리소스 소모가 큼

1) 소프트웨어 개발의 초기 흐름

초기 환경의 문제점

  • 환경 종속성
    • 애플리케이션이 한 시스템에서는 동작하지만, 다른 시스템에서는 오류가 발생하는 문제가 자주 발생
    • 예시 : "내 컴퓨터에서는 되는데…"
  • 서버 간 차이
    • 개발 환경과 운영 환경이 다를 경우, 배포 후 문제가 빈번히 발생
  • 배포 복잡성
    • 애플리케이션과 모든 의존성(라이브러리, 설정 등)을 각 서버에 개별적으로 설치필요

초기 해결책: 가상화
2000년대 초반, VM(Virtual Machine)을 생성하고 배포할 수 있는 다양한 서버 가상화 솔루션이 등장하기 시작되면서 여러 OS와 애플리케이션을 하나의 물리적 서버에서 실행 가능
최초의 가상화 기술은 1960년대 후반 IBM의 서버 컴퓨터인 메인프레임에서 처음 적용


2) 가상화의 한계와 컨테이너 기술의 등장

가상화의 한계

  1. 무거운 리소스 사용
    • 가상 머신마다 독립적인 OS 실행으로 CPU, 메모리 사용이 큼
  2. 속도의 문제
    • VM을 시작하고 애플리케이션을 실행하는 데 몇 분이 걸릴 수 있음
  3. 이식성 부족
    • VM 이미지는 크기가 크고(GB 단위), 환경에 따라 실행 시 추가 설정이 필요

컨테이너 기술의 도입

  • 가상화의 한계를 극복하기 위해 컨테이너(Container) 기술이 주목받기 시작
  • 리눅스 컨테이너(LXC)
    • 2008년, 리눅스 커널에서 제공하는 cgroups와 namespace를 기반으로 컨테이너 기술이 개발
    • 최초의 Linux 컨테이너 엔진

cgroups (Control Group)
리소스 관리와 격리를 통해 대규모 서버 환경에서 애플리케이션을 효율적으로 실행하는 기능
2006년 Google의 엔지니어들이 "Process Containers"라는 이름으로 개발을 시작
2007년 Process Containers -> cgroups로 명칭 변경

Namespace
프로세스를 독립된 환경으로 격리하여 보안과 안정성을 강화 기능
2002년 리눅스 커널 2.4 시절부터 논의되었으며, 초기 구현은 Network Namespace로 시작


3) Docker의 등장 (2013년)

Docker의 탄생

  • 2013년 Solomon Hykes가 DotCloud(현재 Docker Inc.)에서 Docker를 오픈소스로 공개
  • Docker는 기존의 컨테이너 기술(LXC)을 기반으로 하지만, 이를 더욱 사용하기 쉽고 강력하게 개선
    • Docker Hub라는 이미지 공유 플랫폼을 통해 이식성과 재사용성을 강화
    • 개발자 친화적인 CLI(Command Line Interface)와 도구 제공

Docker가 해결한 문제

  1. 환경 종속성 제거
    • 컨테이너에 애플리케이션과 모든 의존성을 포함하여, "한 번 빌드하면 어디서든 실행 가능"한 환경을 만듦
  2. 경량화
    • OS 수준에서 격리하므로 VM보다 훨씬 가볍고 빠름
  3. 자동화 지원
    • Docker Compose, Docker Swarm 등을 통해 멀티 컨테이너 환경 자동화

OS 수준에서 격리한다
--> 컨테이너 기술에서 애플리케이션이 동일한 운영 체제 커널(OS Kernel)을 공유하면서도 독립적인 실행 환경을 제공받는 것을 의미


2. Docker의 핵심 개념

1. 컨테이너(Container)란?

  • IBM에서는 아래와 같이 컨테이너를 정의하고 있다.

    컨테이너는 애플리케이션 코드를 라이브러리 및 종속성과 함께 패키징하는 소프트웨어의 실행 단위입니다. 이를 통해 데스크톱, 기존 IT 또는 클라우드 인프라 등 모든 컴퓨팅 환경에서 코드를 실행할 수 있습니다.

즉, 정리를 하지면 컨테이너란?

컨테이너(Container)는 애플리케이션과 그 종속성을 함께 패키징한 이미지를 실행 가능한 형태로 만들어주는 단위
-> 애플리케이션을 "어느 환경에서든 동일하게 실행"할 수 있는 작은 가상 환경을 제공

2. 이미지(Image)란?

  • 컨테이너 실행의 기반이 되는 템플릿
  • 이미지는 불변(Immutable)하며, 애플리케이션과 모든 의존성을 포함
  • Dockerfile을 사용하여 이미지 빌드가 가능

3. Dockerfile

  • 이미지를 생성하기 위한 스크립트
  • 어떤 기반 이미지(Base Image)를 사용할지, 추가로 설치할 S/W, 실행 명령 등을 정의
  • 예시
    FROM python:3.9
     COPY . /app
     WORKDIR /app
     RUN pip install -r requirements.txt
     CMD ["python", "app.py"]

4. Docker 엔진(Docker Engine)

  • Docker 컨테이너를 관리하고 실행하기 위한 런타임 환경
  • 주요 구성 요소
    • Docker 데몬(Docker Daemon)
      • 컨테이너를 생성, 실행, 관리하는 역할
      • 도커 호스트에서 실행되는 백그라운드 프로세스
      • Docker CLI 명령어 처리, 도커 이미지 다운, 네트워크와 볼륨 등을 관리
    • Docker CLI: 명령줄 인터페이스로 Docker와 상호작용
    • Docker 레지스트리: 이미지를 저장하고 배포하는 공간(예: Docker Hub)

3. Docker의 주요 기능

1. 이식성 (Portability)

  • 한 번 빌드하면 어디서든 실행 가능
  • 로컬 PC, 서버, 클라우드 등 어디서든 동일한 환경을 제공

Docker 컨테이너는 애플리케이션과 해당 의존성을 하나의 패키지로 캡슐화를 진행하고
컨테이너는 실행 환경에서 독립적으로 동작하기에 빌드 시 다양한 환경에서 동일한 실행 가능

2. 효율성

  • 컨테이너는 호스트 OS의 커널을 공유하므로 리소스 사용이 적고, 실행 속도가 빠름
  • 수백 개의 컨테이너를 하나의 서버에서 운영 가능

Docker 컨테이너는 가상 머신과 달리 호스트 OS의 커널을 공유
가상머신(Virtual Machine, VM)은 각기 다른 OS를 실행하기 때문에 무겁고 느리지만,
Docker는 애플리케이션 실행에 필요한 최소한의 리소스만 사용

3. 버전 관리

  • 애플리케이션 상태를 이미지로 저장하여 특정 상태로 쉽게 복원하거나 이전 버전으로 롤백 가능

Docker 이미지는 특정 시점의 애플리케이션과 그 환경 상태를 기록한 스냅샷
따라서 동일한 환경이라도 특정 상태로 복원이 가능

4. 자동화

  • Docker Compose를 사용하면 여러 컨테이너를 정의하고 실행 순서를 자동화 가능

Docker Compose란?
Docker Compose는 여러 개의 Docker 컨테이너를 관리하고 동시에 실행할 수 있도록 도와주는 도구
애플리케이션이 여러 서비스(예: 웹 서버, 데이터베이스, 캐시 등)로 구성될 때, 각각의 서비스가 컨테이너로 분리되어 실행되는데 Docker Compose는 멀티 컨테이너 환경을 쉽게 정의, 실행이 가능

5. 확장성

  • Kubernetes와 같은 오케스트레이션 도구와 결합하여 수천 개의 컨테이너를 자동으로 배포, 확장, 관리
  • 오케스트레이션(Orchestration)
    • IT 환경에서 여러 작업이나 서비스, 애플리케이션의 실행, 관리, 조율을 자동화하고 최적화하는 과정
  • Orchestration Tool
    • IT 인프라와 애플리케이션에서 다양한 작업, 서비스, 프로세스를 자동화하고 관리하는 데 사용되는 소프트웨어

4. 장단점

1) 장점

  • 가볍고 빠른 실행
    • 컨테이너는 호스트 운영 체제의 커널을 공유하므로, 가상 머신(VM)과 달리 추가 운영 체제(OS)를 포함하지 않음
      -> 결과적으로 컨테이너의 크기는 작고, 메모리와 디스크 사용량이 적어짐
    • 일반적으로 컨테이너는 MB 단위 크기, VM은 GB 단위 크기
  • 일관된 환경 제공
    • Docker는 애플리케이션과 해당 의존성을 하나의 컨테이너 이미지에 패키징
    • 개발 환경, 테스트 환경, 운영 환경에서 동일한 컨테이너를 실행할 수 있으므로 환경 차이로 인한 문제가 제거
  • 높은 확장성과 이식성
    • Docker 컨테이너는 어디서든 실행 가능
    • 컨테이너는 가볍기 때문에 동일한 하드웨어에서 더 많은 컨테이너를 실행
    • Kubernetes와 같은 오케스트레이션 도구와 결합하면 대규모 클러스터 환경에서 자동 확장 가능

2) 단점

  • 네트워크와 스토리지 관리가 복잡
    • Docker는 기본적으로 컨테이너 간 격리된 네트워크 환경을 제공하지만, 다수의 컨테이너가 복잡한 네트워크를 통해 통신해야 할 경우 설정이 어려울 수 있음
    • 예시: 멀티 호스트 네트워크, 컨테이너 간 암호화된 통신 설정
  • 스토리지 관련 문제
    • 컨테이너는 휘발성 파일 시스템을 사용하므로 데이터를 지속적으로 저장하려면 볼륨(volume)이나 외부 스토리지를 설정 필요
  • 학습 시간이 필요 (Learning Curve)
    • Docker는 개념적으로 단순하지만, 다음과 같은 기능을 이해하고 활용하려면 시간이 필요
  • 컨테이너 보안은 VM보다 취약할 수 있음
    • 공유 커널
      • 컨테이너는 호스트 OS의 커널을 공유하므로, 커널 취약점이 발견되면 모든 컨테이너에 영향을 미칠 수 있음
      • 가상 머신은 각 VM이 자체 OS를 가지므로, 이와 비교해 보안 계층이 더 적음
    • 악성 코드 문제
      • 악성 컨테이너가 호스트 커널에 접근하려 할 가능성 존재
      • Docker Hub에서 신뢰할 수 없는 이미지를 다운로드하면 취약점이 포함될 수 있음

완화 방안 : 컨테이너 보안을 강화하기 위해 SELinux, AppArmor 같은 추가 보안 도구 사용


4. 마무리

1) 요약

Docker는 애플리케이션을 이미지(Image)라는 형태로 관리하고 컨테이너(Container)라는 독립된 환경에서 실행할 수 있게 해주는 컨테이너 기반 가상화 플랫폼

  • 장점
    • 가볍고 빠른 실행
    • 일관된 환경 제공
    • 높은 확장성과 이식성
  • 단점
    • 네트워크와 스토리지 관리가 복잡
    • 학습 시간 필요
    • 컨테이너 보안은 VM보다 취약할 수 있음

2) 가상화 vs 컨테이너 vs 도커

  • 가상화 Virtualization
    • 가상화는 하나의 물리적 서버에서 여러 개의 운영 체제(Guest OS)를 실행하기 위해 하이퍼바이저(Hypervisor)를 사용하는 기술
  • 컨테이너(Container)
    • 컨테이너는 애플리케이션과 그 실행 환경(라이브러리, 종속성 등)을 캡슐화하여, 동일한 환경에서 실행할 수 있도록 하는 기술
  • 도커(Docker)
    • Docker는 컨테이너를 쉽게 만들고 관리할 수 있는 플랫폼
    • 테이너 기술을 활용하기 위한 가장 대표적인 도구

3) 컨테이너 가상화 vs 컨테이너

  • 컨테이너 가상화(Container Virtualization)

    • 컨테이너 가상화는 OS 수준에서의 가상화 기술을 의미하며, 하나의 운영 체제에서 여러 애플리케이션을 격리하여 실행할 수 있도록 하는 기술
    • 리눅스 커널의 namespace와 cgroups 같은 기술을 기반으로, 프로세스 간 격리와 리소스 제어를 가능하게 함
  • 컨테이너(Container)

    • 컨테이너는 컨테이너 가상화 기술을 활용하여 독립적으로 실행되는 애플리케이션과 그 실행 환경을 의미
    • 예: Docker 컨테이너는 컨테이너 가상화를 활용하여 애플리케이션을 패키징하고 실행
  • 컨테이너 가상화: 기술적인 접근법과 방법론(기반 기술)
    • 예: "자동차의 작동 원리(엔진, 기어 작동 방식 등)"를 배우는 과정
  • 컨테이너: 기술이 적용된 실제 사용 가능한 구현체
    • 예: 자동차 자체(실제 도로에서 운전 가능한 차량)

@참고 문헌
IBM-docker
IBM - Container
Docker의 개념 및 핵심 설명
가상화-가상화의 등장 배경과 발전
컨테이너 기술의 역사와 발전

profile
성장하는 개발자가 되기 위한 기록 일지

0개의 댓글