도커에 대해 알아보자

Seungbeom oh·2024년 12월 23일

Docker(도커)

  • 도커는 애플리케이션을 컨테이너라는 표준화된 단위로 패키징하고 실행할 수 있게 해주는 플랫폼(Claude)

  • 도커는 애플리케이션을 컨테이너라는 단위로 패키징, 배포 및 실행할 수 있도록 해주는 오픈 소스 플랫폼(GPT)

  • 실행 환경의 일관성과 이식성을 위해서 도커를 사용.

  • 실제로 도커의 개발자들이 Pycon에서

    • 한 서버에서 다른 서버로 앱을 옮기는 것보다 지구 반대편에서 자동차를 배송하는 것이 더 쉽다라고 발언.

Container(컨테이너)

  • 도커 홈페이지에서 말하는 컨테이너란?
    컨테이너는 코드와 모든 종속성을 패키징하는 표준화된 소프트웨어 단위로, 애플리케이션이 한 컴퓨팅 환경에서 다른 환경으로 빠르고 안정적으로 실행될 수 있게 합니다. 도커 컨테이너 이미지는 가볍고, 독립적이며, 실행 가능한 소프트웨어 패키지로 애플리케이션 실행에 필요한 모든 것을 포함합니다: 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정을 포함합니다.

  • VM(Virtual machines)에는 OS가 존재하여 기본적으로 무겁지만, Containers는 이러한 OS가 존재하지 않음.
  • Container에 대해 이해기 위해 우리는 cgroups, Namespaces 이 두 가지에 대해 이해해야한다.

Container의 발전 과정

  • Unix V7에서 chroot 도입(1979)

  • Unix v7 : 유닉스의 버전 7

  • chroot : change root의 약자로 당시에 해커들로 부터 시스템을 보호하기 위해 환경을 분리하는데 많이 사용됨.

  • 나머지 시스템의 접근을 막고 한곳에 가둔다는 의미로 보통 jail이라고 많이 표기됨.
  • 한계점
    • chroot는 말그대로 격리만 제공함.
    • 시스템 리소스를 사용하는 것에 대한 제한이 없음
    • 다른 프로세스와 통신이 가능함.
    • 보완성이 약함
      • root 사용자는 chroot 쉽게 탈출함
      • SetUID 프로그램을 통한 권한 상승 위험이 있었다.
        • SetUID가 설정된 파일을 실행할 때, 일시적으로 파일 소유자의 권한을 얻어 실행함.
        • root 권한으로 지정된 프로그램에 SetUID가 지정되어 있다면, 실행 할 때 root 권한으로 실행됨.
  • FreeBSD Jails의 등장(2000)

    • 실제로 container의 뼈대가 들어나기 시작.

    • FreeBSD : 유닉스 계열의 무료 Opensource OS

    • chroot의 한계를 극복하고 더 강력한 격리 기능을 제공하기 위해 개발됨.

    • Jail의 특징

      • Jail은 Sandbox이 되어, 다른 jail에 접근이 안되며, jail에 할당되지 않은 외부의 파일과 리소스에 접근할 수 없음.

        • Sandbox : 외부 환경으로부터 격리된 보안 환경을 의미. 어린이들이 노는 모래놀이터에서 유래됨.
        • 해당 특징으로 jail에서 어떤 변경이 일어나든 Host에는 아무런 영향이 가지 않음.
        • 이를 통해 보완성을 강화
      • 각 Jail들은 독립된 권한을 가짐.

        • chroot를 통해 여러 개의 서버와 실험용 서버를 운용하는 것처럼 사용이 가능함.
        • 실제롤 각 Jail들을 각각 특정 IP를 가짐.
      • 빠른 속도

        • Virtual Machine은 각기 다른 OS를 가질 수 있지만, Jail은 기본적으로 동일한 OS를 가짐.
      • 계층성이 존재

        • 각 Jail은 하위 Jail을 가질 수 있어, 다양한 구성이 가능해짐.
      • 커널과 장치에 대한 접근 제한

        • jail은 커널을 수정할수 없고, 장치 파일을 만들 수 없음.
      • Jail을 복사하거나 스냅샷을 찍을 수 있음.

        • 백업본을 만드는게 수월함.
  • Virtuozzo와 Linux VServer등장(2001)

    • Virtuozzo는 현재는 AWS와 같이 Cloud Platform을 주로 다루는 회사가 되었지만, 2001년에는 하나의 물리적 서버를 여러개의 독립적인 Virtual Private Server(VPS) 서버로 분할하여 운영할 수 있도록 도와주는 솔루션을 주로 제공함.

      • 당시 2000년도는 닷컴버블로 인터넷 사용량이 폭팔하던 시기로, 많은 기업들과 개인이 웹사이트, 이메일, 데이터베이스 등을 운영하기 위한 서버 호스팅이 필요됨.
      • 또한, 초기에는 물리적 서버를 구성한다고 해서 여러개의 독립적인 서버로 사용하는게 아니라 서버 성능에 비해 리소스를 매우 적게 사용함.
      • 하드웨어 자원을 더 효율적으로 사용하기 위한 물리적 서버를 여러개의 VPS로 나누는 요구가 늘어났고, 현재도 GPT 피셜로 자체 서버를 운영할 경우 초기에 300만원, 매월 10~20만 정도 운영 비용이 지속적으로 발생하는 것처럼 기업 수준과 개인 수준에서 서버를 구성하는건 비용적 측면에서 고려하기 어려웠다.
      • Linux 뿐만 아니라 Windows 환경 등 다양한 환경에서 VPS 관리 서비스 제공.
    • 는 리눅스 서버에서 효율적인 자원 분할과 격리를 위한 기술.

    • 리눅스 환경에서 다수의 가상 환경을 운영할 수 있도록 설계됨.

    • 하나의 물리적 서버를 저비용과 경량화된 가상화방법으로 여러 개의 독립적인 서버 환경을 제공.

    • 특히 Kernel Level Isolation을 사용함.

  • 비슷한 시기에 FreeBSD, Virtuozzo와 Linux VServer등이 등장했지만, 각기 다른 목표를 가짐
FreeBSDVirtuozzoLinux VServer
철학컴퓨터 하나를 여러개의 독립된 작은 시스템으로 나누기물리적 서버를 각자 독립된 서버처럼 사용하나의 시스템을 여러 개의 독립된 컨텍스트로 분리
목표보안 격리에 중점서버 가상화 및 호스팅 환경의 효율성 극대화리눅스 시스템의 파티셔닝
  • Oracale Solaris

    • 단순히 기업 환경에 특화된 컨테이너를 제공.
  • cgroups(control groups)

    • 원래 이름은 프로세스 컨테이너였지만, 컨테이너 이름 충돌을 바꾸기 위해 이름을 변경. (.feat 구글 개발-> 해당 내용이 Linux Kernel version 2.6.24에 도입됨)

    • cgroups은 사용자가 여러명인 서버에서 자원 관리의 필요성에 비롯됨.

      • 여러 프로세스가 동시에 실행되면, 이들 간의 자원 경쟁이 될 수 있음.
      • 그러면 이전애들은 리소스 관리를 제공하지 않았냐?
        • NO! 실제로 제공함 But! 부족했다.
    • 도커에서 컨테이너의 격리환경을 만들기 위해 cgroupsnamespace

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

      • CPU :
      • 메모리 :
      • 디스크 I/O:
      • 네트워크:
    • cgroups의 구조

  • V2의 발전
    • 단일한 계층 구조: 모든 컨트롤러를 통합 -> v1에서는 여러 계층 구조로 인한 복잡성을 줄임.
      • v1은 subsytem을 통해 연결되어 있었음.
    • 일관된 인터페이스: 모든 컨트롤러가 유사한 방식으로 동작하여, 일관된 파일과 디렉토리 구조를 가짐.
    • 통합된 리소스 관리: 메모리 CPU, IO 등 다양한 자원을 통합적으로 관리할 수 있음.
  • cgroups의 사용
  • namespace

    • 2002년 Linux Kernel 2.4.19 때 최초로 등장한 기술로 프로세스들이 독립된 공간을 사용할 수 있도록 격리하된 환경을 제공하는 프로세스 가상화 기술.
    • H/W를 가상화하는것과는 달리, 실행 환경 자체를 구분하는 기술
    • 격리되는 리소스
      • 프로세스 ID
      • Host ID
      • User ID
      • Network 접근
      • 프로세스 통신(IPC)
      • 파일 시스템
    • Names 종류
      • Mount namespace: 파일시스템 마운트 지점을 격리하여 독립적인 파일시스템 트리를 관리
      • UTS namespace: Host와 Domain을 격리하여 각 컨테이너에 독립적인 Host 식별자 관리
      • IPC namespace: 프로세스간 통신(IPC) 리소스를 격리하여 독립적인 통신 환경 관리
      • PID namespace: 프로세스 ID를 격리하여 독립적인 프로세스 트리 제공
      • USR namespace: 사용자와 그룹 ID를 격리하여 독립적인 사용자 권한 관리
      • NET namespace: 네트워크의 스택을 격리하여 독립적인 네트워크 환경 관리
  • 참고링크
    카카오테크
    모두의근삼이
    미디움

profile
AI Engineer 오승범

0개의 댓글