Docker

HEUKWU·2023년 5월 12일
0

가상화 기술은 IT 산업에 혁명을 일으켰으며, VMware와 같은 가상 머신은 많은 이점을 제공한다. 하지만 기존의 가상 머신은 하이퍼바이저를 사용하여 호스트 운영 체제 위에서 독립적인 가상 운영 체제를 실행하는 방식이었다. 따라서 실행 속도가 느리고 무겁고 리소스 사용에 있어서 비효율적인 단점이 있었다.

이러한 단점을 극복하기 위해 탄생한 기술이 컨테이너 기반 가상화 기술이다.

컨테이너는 호스트 운영 체제의 리소스를 공유하여 프로세스를 격리 실행하는 방식으로, 가상 머신보다 가볍고 빠른 실행 속도를 제공하며, 리소스 사용이 효율적이다. 또한 애플리케이션과 그에 필요한 종속성, 라이브러리, 설정 등을 패키지화하여 이식성과 일관성을 갖춘 실행 환경을 제공한다.

Docker는 이러한 컨테이너 기반 가상화 기술을 이용하여 탄생했다. 2013년 Docker, Inc.에 의해 개발되었으며, 컨테이너 기반 가상화를 간단하고 편리하게 사용할 수 있도록 CLI(Command Line Interface)와 API를 제공하며, 이미지 기반의 컨테이너 관리를 중심으로 개발되었다.

따라서 개발자는 동일한 환경에서 애플리케이션을 개발하고 테스트할 수 있으며, 컨테이너화된 애플리케이션의 배포와 확장이 용이하고 리소스 사용이 효율적인 환경을 구성할 수 있다.

하이퍼바이저
호스트 시스템(물리적 서버)상에서 다수의 가상 머신을 실행시킬 수 있도록 한다. 각각의 가상머신은 자체적인 운영 체제와 리소스를 가지고 있으며, 서로 독립적으로 실행될 수 있다.

컨테이너

도커는 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

도커의 핵심 개념인 컨테이너는 애플리케이션과 그에 필요한 종속성, 라이브러리, 설정 등을 패키지화하여 독립적이고 일관된 실행 환경을 제공한다.

컨테이너는 도커 이미지를 기반으로 생성된다. 이미지는 애플리케이션과 실행 환경을 정의하는 읽기 전용 템플릿으로, 파일 시스템, 라이브러리, 실행 파일, 환경 변수 등이 포함된다. 여러 개의 계층으로 구성되며, 변경이 가능한 부분과 불가능한 부분을 분리하여 효율적인 이미지 관리를 가능하게 한다.

출처 - docker.com

특징

  • 격리
    컨테이너는 호스트 시스템 및 다른 컨테이너로부터 격리되어 독립적으로 실행된다. 따라서 각 컨테이너는 자신만의 파일 시스템, 네트워크 인터페이스, 프로세스 공간 등을 가질 수 있다.

  • 빠른 속도
    호스트 운영 체제의 커널을 공유하므로 추가적인 가상화 계층이 없고, 직접적으로 하드웨어와 상호작용할 수 있어 가상 머신보다 가볍고 빠른 실행 속도를 제공한다.

  • 이식성
    이미지 기반으로 작동하기 때문에 이식성이 우수하다. 실행 환경과 애플리케이션의 종속성을 포함하고 있어 동일한 이비지를 사용하여 어떤 환경에서든 애플리케이션을 실행할 수 있다.

  • 확장성
    여러 개의 컨테이너 인스턴스를 실행하여 애플리케이션의 부하를 분산시킬 수 있고, 필요에 따라 컨테이너의 개수를 늘리거나 줄일 수 있다. 따라서 애플리케이션의 성능과 가용성을 향상시킨다.

  • 격리된 환경
    각 컨테이너는 자신만의 리소스를 사용하고 서로에게 영향을 주지 않는다. 따라서 애플리케이션 간의 충돌을 방지하고 보안을 강화할 수 있다.

  • 유연한 관리
    도커는 컨테이너의 라이프사이클을 관리하기 위한 다양한 도구와 기능을 제공한다. 컨테이너는 쉽게 생성, 시작, 중지, 삭제할 수 있으며, 이미지의 업데이트와 배포 또한 용이하다.

가상머신
호스트 운영 체제 위에 독립적인 운영체제를 실행하는 방식
컨테이너
호스트 운영 체제의 리소스를 공유하여 프로세스를 격리시켜 실행하는 방식

이미지

컨테이너의 실행 환경과 애플리케이션을 패키지화한 템플릿이다. 도커 이미지는 읽기 전용으로 생성되며, 여러 개의 계층(Layer)으로 구성되어 변경 가능한 부분과 변경 불가능한 부분을 분리하여 효율적인 관리와 배포를 가능하게 한다.

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있기 때문에 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 아무런 변화가 없다.

또 이미지는 컨테이너를 실행하기 위한 모든 정보를 갖고 있어 더 이상 의존성 파일을 컴파일하고 설치할 필요가 없다. 새로운 서버가 추가되면 이미 생성된 이미지를 다운받고 컨테이너를 생성하면 된다. 한 서버에 여러개의 컨테이너를 실행할 수 있다.

도커 이미지는 Docker hub에 등록하거나 Docker Registry저장소를 직접 만들어 관리할 수 있다.

도커 이미지는 컨테이너의 모든 정보를 담고 있어 용량이 매우 크다. 이 문제를 해결하기 위해 레이어라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다.

이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

컨테이너를 생성할 때에도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용할 수 있다.

도커 이미지 구조

베이스 이미지(Base Image): 도커 이미지의 가장 하위에 위치하는 기반 이미지는 운영 체제(예: Ubuntu, CentOS)나 미들웨어(예: Apache, MySQL) 등의 기본적인 실행 환경을 포함한다. 기반 이미지는 읽기 전용이며, 다른 레이어의 기반이 되는 부분이다.

중간 레이어(Intermediate Layer): 중간 레이어는 기반 이미지 위에 추가적인 파일 시스템 변경 사항을 담고 있다. 예를 들어, 애플리케이션 코드, 라이브러리, 설정 파일 등이 중간 레이어에 포함된다. 중간 레이어는 읽기/쓰기 가능한 레이어이며, 이미지를 빌드할 때 생성되는 계층 중 하나이다.

최상위 레이어(Top Layer): 최상위 레이어는 중간 레이어 위에 추가적인 변경 사항을 담고 있다. 예를 들어, 애플리케이션 실행을 위한 환경 변수, 실행 명령 등이 최상위 레이어에 포함된다. 최상위 레이어도 읽기/쓰기 가능한 레이어이다.

도커 이미지의 레이어 방식

출처 - https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

Docker Image에는 ubuntu, nginx, web app 의 세 가지 이미지로 구성되어 있다. nginx는 ubuntu를 기반으로 만들어졌다고 가정하고, web app 이미지는 nginx 이미지를 기반으로 만들어졌다고 가정하겠다. ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx 이다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성된다.

webapp소스를 수정한다면 A, B, C, nginx 레이어를 제외한 새로운 source 레이어만 다운받으면 되기 때문에 효율적으로 이미지를 관리할 수 있다.

컨테이너 또한 레이어 방식을 사용하는데 컨테이너는 읽기/쓰기 가능한 레이어로 구성되며, 해당 이미지의 최상위 레이어 위에 추가적인 변경 사항을 저장한다. 컨테이너에서 발생한 변경 사항은 컨테이너에 대한 새로운 읽기/쓰기 가능한 레이어에 저장된다.

따라서 여러 개의 컨테이너가 같은 이미지를 기반으로 생성되더라도, 각 컨테이너는 서로 다른 읽기/쓰기 가능한 레이어를 가지고 있어서 독립적인 파일 시스템을 가질 수 있다.

특징

  • 베이스 이미지
    도커 이미지는 베이스 이미지를 기반으로 생성된다. 기반 이미지는 특정 운영 체제(Ubuntu, CentOS)나 미들웨어(Apache, MySQL) 등을 포함하는 베이스로 사용된다. 기반 이미지는 Docker Hub와 같은 공개 이미지 저장소에서 가져오거나 직접 작성할 수 있다.

  • 계층화
    도커 이미지는 여러 개의 계층으로 구성된다. 각 계층은 이미지를 구성하는 파일 시스템의 변경 사항을 담고 있다. 계층은 이전 계층에 대한 변경 사항만을 저장하기 때문에 이미지 간의 중복을 최소화하고 이미지 생성과 배포 시간을 단축시킨다.

  • 읽기 전용
    도커 이미지는 읽기 전용으로 생성되며, 이미지가 생성된 후에는 변경할 수 없다. 따라서 이미지의 일관성과 안정성을 보장하며, 여러 컨테이너가 동일한 이미지를 사용하여 실행될 수 있도록 한다.

  • 이미지 레지스트리
    도커 이미지는 이미지 레지스트리에 저장되고 공유된다. 도커 허브(Docker Hub)는 가장 널리 알려진 공개 이미지 레지스트리이며, 수많은 공개 이미지를 제공한다. 또한, 도커는 프라이빗 이미지 레지스트리를 구축하여 조직 내에서 이미지를 관리하고 공유할 수 있다.

  • 버전 관리
    도커 이미지는 버전 관리가 가능하다. 이미지에 변경 사항이 생기면 새로운 버전을 생성하여 관리할 수 있다. 따라서 애플리케이션의 롤백, 업데이트, 배포 등을 효과적으로 처리할 수 있다.

  • 이미지 레이어 캐싱
    도커는 이미지 레이어의 변경 사항을 캐싱하여 빌드 시간을 최적화한다. 이전에 빌드한 이미지 레이어가 캐시에 저장되어 있다면 동일한 레이어를 다시 다운로드하거나 빌드할 필요가 없으므로 빌드 속도가 향상된다.

컨테이너와 가상머신 비교

출처 - docker.com

컨테이너와 가상 머신은 리소스 격리 및 할당 이점이 비슷하지만, 컨테이너는 하드웨어 대신 운영 체제를 가상화하기 때문에 작동 방식이 다르다. 컨테이너는 휴대성과 효율성이 더 뛰어나다.

컨테이너

컨테이너는 코드와 종속성을 함께 패키징하는 앱 계층의 추상화이다. 여러 개의 컨테이너가 동일한 머신에서 실행될 수 있으며, 각각 사용자 공간에서 격리된 프로세스로 실행되는 다른 컨테이너와 운영 체제 커널을 공유할 수 있다. 컨테이너는 VM보다 공간을 적게 차지하며, 더 많은 애플리케이션을 처리할 수 있고, 더 적은 수의 VM과 운영 체제를 필요로 한다.

가상머신

가상 머신(VM)은 하나의 서버를 여러 대의 서버로 전환하는 물리적 하드웨어의 추상화이다. 하이퍼바이저를 사용하면 단일 머신에서 여러 VM을 실행할 수 있다. 각 VM에는 운영 체제, 애플리케이션, 필요한 바이너리 및 라이브러리의 전체 복사본이 포함되며, 이는 수십 GB를 차지한다. VM은 부팅 속도가 느릴 수도 있다.

0개의 댓글

관련 채용 정보