본문 바로가기
Docker

[Docker] Docker란?

by 기리의 개발로그 2022. 2. 22.

기존의 가상머신

가상 머신 자체는 완전한 컴퓨터라 할 수 있다.
OS를 자체적으로 가지고 있기 때문에 OS를 가상머신 이미제 포함해야 하고, 배포이미지의 용량이 커지게 되는 단점이 있다.
전가상화, 반가상화 게스트 OS를 설치하여 운영하는 방식은 하드웨어 성능을 100% 뽑아내기 어렵다는 단점을 가지고 있기 떄문에 성능 개선 문제가 대두 되었고, 이를 해결하기 위한 프로세스 격리 방식이 나오게 되었다.

컨테이너 기술

리눅스에서는 리눅스 컨테이너라 불리는 곳에 프로세스를 격리시키는데, OS의 내부에는 물리적 자원을 관리하는 커널공간과 사용자 프로세스를 실행하는 사용자 공간으로 나뉘어진다.
컨테이너 가상화는 사용자 공간을 여러 개로 나누어 각각의 사용자 프로세스에서 보이는 리소스를 제한하여 CPU나 메모리는 프로세스가 필요한 만큼만 추가적으로 사용하고 성능적으로 거의 손실이 없다.
기존의 가상화 기술에서는 가상 머신이 실제 물리 하드웨어에 에뮬레이트하기 떄문에 OS가 반드시 필요하다.
LXC는 모든 프로세스는 호스트 OS에서 시작하며, 일반적인 프로세스와 달리 그 과정의 일부를 그룹화하고 다른 그룹과 그룹에 속하지 않는 프로세스에서 단절된 공간으로 동작한다는 것이다.
이러한 방식의 차이점 떄문에 가상화 오버헤드가 거의 발생하지 않고 가상 머신의 부팅 및 종료라는 개념이 존재하지 않는다.
OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있고, 가상 환경의 시작과 종료를 빠르게 실행할 수 있다.
컨테이너 방식은 OS에서 관리하기 때문에 "OS 레벨 가상화"라고 불리기도 한다.

컨테이너의 장점과 기술

  • 빠른 시작과 종료 속도
    • LXC를 사용하다 보면 다른 가상화 기술머신보다 시작과 종료가 빠르다는 것을 알 수 있다.
    • 컨테이너를 생성한다는 것은 OS 입장에서 단순히 프로세스를 시작하는 것이기 때문에 일반적인 프로세스가 시작하는 것과 별반 차이가 없다.
    • 가상환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없고, 하드웨어 초기화 등의 작업이 필요없다.
  • 높은 집적도
    • 컨테이너는 커널이 직접 프로세스를 조작하여 분리된 공간을 구성하기 때문에 PC상에서 동작하는 OS는 하나이다.
    • 여러 개의 컨테이너를 만들어 실행 중이라고 해도 OS는 하나이기 때문에, 가상머신에 비해 고밀도가 가능하다.
    • 컨테이너에서는 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서도 동작이 가능하다.
  • 낮은 오버해드
    • 가상화를 위한 하드웨어 에뮬레이트 단계없이, 분리된 공간을 만들기 때문에 오버해드가 줄어든다.

Docker

Docker란 어플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 어플리케이션 실행환경을 구축 및 운용하기 위한 컨테이너 기반의 오픈소스 플랫폼이다.
컨테이너 기술을 사용하며 프로세스를 격리시켜서 사용하는 방식이므로 가볍고 빠른 동작이 가능하며, 하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 가볍다.

Docker Container

컨테이너란 프로그램이 작동하기 위한 최소한의 요소들을 묶어 패키징한 OS이며 시스템을 가상화 하는 것이 아닌 어플리케이션을 구동할 수 있는 환경을 가상화한 것이다. 따라서 가볍고 성능이 좋으며 빠른 빌드와 배포가 가능하다. 현재의 컨테이너는 LXC(Linux Containers)를 기반으로 한다.
다음과 같은 특징을 가지고 있다.

  • Docker Container는 Docker image가 실행된 형태이다.
  • 컨테이너에서 파일을 만들거나 서비스를 설치하면 컨테이너 레벨에서 저장이 되고 이미지에는 영향을 미치지 않는다.

Docker Image

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다.
다음과 같은 특징을 가지고 있다.

  • 컨테이너는 이미지를 실행한 상태이며 추가되고 변하는 값은 컨테이너에 저장된다.
  • 같은 이미지를 여러 개의 컨테이너에서 생성할 수 있고 컨테이너의 상태가 변경되거나, 삭제되어도 이미지는 변하지 않는다.
  • 컨테이너를 실해하기 위한 모든 정보를 가지고 있기 때문에 의존성 파일을 컴파일하고 이것저것 설치할 필요성이 사라진다.
  • 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성하면 된다.
  • 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 만들어 관리할 수 있다.

레이어 저장방식

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백MB이다.
기존 이미지에 파일이 추가되었을 때 다시 이미지를 새로 받으면 비효율적인데, 이를 해결하기 위해 도커에서는 레이어라는 개념을 도입하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다.
예를 들어 ubuntu 이미지가 A + B + C 의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 되며, 마찬가지로 nginx 이미지 기반으로 webapp 이미지를 만들었다면 Webapp 이미지는 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 변경된 source2 레이어만 다운받으면 되므로 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생상할 때도 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다.

반응형

'Docker' 카테고리의 다른 글

[Docker] Dockerfile  (1) 2022.02.24
[Docker] Docker 명령어(3)  (0) 2022.02.23
[Docker] Docker 명령어(2)  (0) 2022.02.23
[Docker] Docker 명령어(1)  (0) 2022.02.23
[Docker] Docker 설치  (0) 2022.02.22

댓글