[Docker] 도커의 이해

Na young·2024년 1월 23일
0

Docker

목록 보기
2/8

Docker

2013.03 Pycon에서 Docker의 창시자인 솔로몬 하익스가 처음으로 소개를 했다.

  • 여러 계층의 어플리케이션을 컨테이너로 분리, 연결하여 실행하는 마이크로서비스 아키텍처 프로젝트에 유용

  • 애플리케이션의 인프라 (runtime)는 이미지를 통해 제공하고 public or private하게 공유 가능

  • 깃허브와 유사한 방식인 open share로 Docker Hub에서 제공

  • Image를 기반으로 애플리케이션 서비스 제공, 이를 컨테이너화 할 수 있다.


가상화(virtualization)

  • 서버, 스토리지, 네트워크, 애플리케이션 등을 가상화하여 하드웨어 리소스를 효율적으로 사용하도록 한다.

  • 기업은 효율적인 자원 활용, 자동화된 IT 관리, 빠른 재해 복구 등의 장점이 있다.

  • 물리적 하드웨어 유지 관리 대신 소프트웨어적으로 가상화를 통해 제한된 부분을 쉽게 관리, 유지 가능

  • 하이퍼바이저 기반의 가상머신(VM, Virtual Machine)을 통해 수행

    • VMware, VirtualBox

가상화 기술의 역사

1991 ~ : 리눅스 프로세스 격리 (Linux, LXC)
2010 ~ : Virtual Machine 가상화기술 (VMware, virtualbox)
2013 ~ : 컨테이너 가상화기술 (dotcloud, docker)
2015 ~ : 컨테이너오케스트레이션 (쿠버네티스, AWS, Azure, docker swarm, GCP)

컨테이너 가상화 vs VM 가상화

공통점
실행하고자하는 애플리케이션 프로세스 및 종속 요소와 소스 등을 패키지, 즉 이미지화 하여 HostOS와 격리된 환경을 제공한다.

VM 가상화
실제 호스트 운영체제와 같이 별도의 GuestOS를 갖고 원하는 애플리케이션을 설치하는 하드웨어 수준의 가상화 구현

컨테이너 가상화
VM가상화에 비해 경량이면서 호스트 운영체제의 커널을 공유하는 OS 수준의 가상화 구현
-> 원하는 애플리케이션 환경을 빠르게 번들링하여 패키징

컨테이너와 가상머신

컨테이너는 Hypervisor와 완전히 다른데
궁극적으로는 hypervisor와 유사한 형태의 가상화를 목표로 하고 있다.
하지만 htpervisor는 OS 및 커널이 통째로 가상화되는 반면에
container는 filesystem의 가상화 만을 이룬다.


컨테이너화 (Containerization) 기술

  • 리눅스 컨테이너 기술은 LXC를 이용한 시스템 컨테이너화로 시작되었다

  • OS 수준의 가상화 도구

  • cgroup, namespace 등의 커널 기술을 공유해 컨테이너에 제공한다

Namespace

  • VM에서는 각 게스트 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 갖고 있다.
  • 리눅스에서는 위 기능을 namespace 기능을 커널에 내장하고 있다
    • mnt (filesystem mount) : 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트/언마운트
    • pid (process ID) : 독립적인 프로세스 공간 할당
    • net (network) : namespace 간의 network 충돌 방지 - 중복 포트 바인딩 등
    • ipc (systemV IPC) : 프로세스 간의 독립적인 통신통로 할당
    • uts (hostname) : 독립적인 hostname 할당
    • user (UID) : 독립적인 사용자 할당

cgroups (Control Groups)

  • cgroups는 자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능

    • 메모리
    • CPU
    • I/O
    • 네트워크
    • device 노드 (/dev/)

  • 초기 노드는 LXC를 그대로 응용하여 사용

  • 현재에는 containerd, runC를 이용하도록 변경

  • runC : 커널 기술 공유를 통해 컨테이너 생성
  • containerd : 생성된 컨테이너의 라이프사이클 관리
  • dockerd : 사용자 환경에서 명령 전달

  • docker는 1.11 ver부터 위와 같은 구조로 작동한다
  • containerd는 OCI 구현체 (주로 runC)를 이용하여 container를 관리해주는 daemon이다
  • Docker engine 자체는 이미지, 네트워크, 디스크 관리 역할을 한다
  • Docker engine과 containerd가 완전히 분리되어 있기에 Docker engine을 업그레이드할 때, 재시작해도 container의 재시작 없이 사용할 수 있다.
profile
개발어린이

0개의 댓글