[ Docker ] 01. Docker Container 이해하기(Docker구성요소, Docker vs Container)

duck-ach·2023년 8월 29일
0

Docker

목록 보기
1/1

Docker

'Docker는 컨테이너 형 가상화 기술 중 하나이다.'

컨테이너(Container)란?

컨테이너(Container)란 Host OS 상에 논리적인 구획을 만들고 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.

Host OS의 Resource들을 논리적으로 분리시키고 여러 개의 컨테이너가 공유하여 사용하게된다.
컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동한다.

도커(Docker)란?

도커는 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼이다.
도커는 일반적으로 도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 말합니다.

NameDescription
Client도커를 설치하면 그것이 Client며 build, pull, run 등의 도커 명령어를 수행합니다.
DOCKER_HOST도커가 띄워져있는 서버를 의미합니다. DOCKER_HOST에서 컨테이너와 이미지를 관리하게 됩니다.
Docker daemon도커 엔진입니다. 기능을 수행하는 Service의 역할을 합니다.
Registry외부(remote) 이미지 저장소입니다. 다른 사람들이 공유한 이미지를 내부(local) 도커 호스트에 pull할 수 있습니다. 이렇게 가져온 이미지를 run하면 컨테이너가 됩니다.
public Registry 종류Docker Hub, QUAY
private Registry 종류AWS ECR 혹은 Docker Registry를 직접 띄워서 비공개로 사용하는 방법등이 존재합니다.

도커 핵심 요소


도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너이며 도커 엔진의 핵심이다.
도커 이미지와 컨테이너는 1:N 관계이다.

Docker FileBuild 하면 Docker Image가 되고, Docker ImageRun 하면 Docker Container를 생성할 수 있다.

도커 이미지(Docker Image)

Docker Image는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다.
이미지는 컨테이너를 생성하고, 실행할 때 읽기 전용으로 사용되며 여러 계층으로 된 바이너리 파일로 존재한다.

도커에서 사용하는 이미지의 이름은 기본적으로 아래의 형태로 구성된다.

[저장소이름]/[이미지이름]:[태그]

  • 저장소이름 : 이미지가 저장된 장소. 저장소 이름이 명시되지 않은 이미지는 도커 Hub의 공식 이미지를 뜻함
  • 이미지이름 : 해당 이미지가 어떤 역할을 하는지 나타내며 필수로 설정해야함
    ex) ubuntu:latest -> Ubuntu Container를 생성하기 위한 이미지라는 것을 나타냄
  • 태그 : 이미지의 버전을 나타냄. 태그를 생략하면 도커 엔진은 latest로 인식함

도커 컨테이너(Docker Container)

Docker Container는 Docker Image(도커 이미지)로 생성할 수 있으며, 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간(프로세스)이 생성된다.

대부분의 도커 컨테이너는 생성 될 때 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지고 있기 때문에 도커 이미지의 목적에 맞게 사용되는 것이 일반적이다.

Virtual Machine(가상머신) vs Docker Container(도커 컨테이너)

기존에도 가상화 기술은 존재해왔지만, 도커가 기존의 가상화 기술과 비교했을 때 개발 속도의 측면에서도 훨씬 빠르고, 운영의 효율성도 극대화 되며, 폭 넓은 구동 환경에서 구동할 수 있다.

공통점

우선 공통점으로는 그림에서 보이듯이 가상 OS가 실행되는 환경이 격리된 것을 확인할 수 있다. Docker와 Virtual Machine은 물리적인 한 하드웨어 안에서 논리적으로 격리된 환경에 애플리케이션을 배치한다.

가상머신(Virtual Machine)

하이퍼바이저(Hypervisor)를 이용한 가상화 방식

기존의 가상화 기술인 가상머신(Virtual Machine)은 하이퍼바이저(Hypervisor)를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해서 사용하는 방식이다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고 각 가상머신에는 Ubuntu, ContOS, Redhat 등의 운영체제가 설치되어 사용된다.

그래서 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제(Guest OS)라고 한다.
각 게스트 운영체제(Guest OS)는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용한다.

이러한 가상머신의 가상화 방식을 사용하는 툴은 VirtualBox, VMware 등이 있다.

가상머신 방식의 문제점

가상머신은 Hypervisor를 통해 여러개의 운영체제를 생성되고 관리된다. (Guest OS)

  • 시스템 자원을 가상화 하고 독립된 공간을 생성하는 작업은 Hypervisor를 거침 → 성능 손실이 큼
  • 가상머신은 Guest OS를 사용하기 위한 라이브러리, 커널 등을 포함 → 배포할 때 용량이 큼

즉, 가상머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있다.

도커 컨테이너(Docker Container)

컨테이너를 이용한 가상화 방식

도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체기능인 chroot, 네임스페이스(namespace), cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.

  • chroot : 현재 실행중인 프로세스와 자녀 프로세스의 루트 디렉토리를 변경할 수 있는 명령어이다. 특정 디렉토리 경로를 root로 지정함으로써 환경을 분리할 수 있다.
  • 네임스페이스(namespace) : 개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게된다.
  • cgroup : 프로세스들의 자원의 사용(CPU, Memory, Disc IO, Network 등)을 제한하고 격리시키는 리눅스 커널 기능이다.

가상머신의 문제점을 개선한 컨테이너의 장점

  • 도커 컨테이너는 가상화 된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만든다 → 성능 손실이 없음
  • 가상머신과 달리 커널을 공유해서 사용하므로 컨테이너에는 라이브러리 및 실행 파일만 있다 → 용량이 작음

위의 이유로 컨테이너를 이용하면 배포하는 시간이 가상머신에 비해 빠르고, 사용할 때 성능 손실 또한 적다.

그렇다면 도커(Docker)가 가상머신(Virtual Machine)보다 좋을까?

위에서 설명한대로라면 가상머신을 사용할 이유가 없다. 그렇다면 무조건 Container방식이 좋을까?

공유의 양면성

Docker는 커널을 공유 한다. 커널을 공유 한다는 것은 많은 장점을 가지고 있지만 단점도 가지고 있다. 공유는 전염을 당할 수 있다는 의미이며 직관적으로 Host OS가 불안정 해진다면 이를 공유받고 있는 Container에도 영향을 끼칠 수 있다.

가상머신의 경우 여러가지 필수 파일들이 각각 Host마다 필요로 하기 때문에 더욱 독립적인 환경이기 때문에 보안 측면에서 유리하다.
도커의 경우 훨씬 가볍고 간단하게 새로운 프로세스를 띄울 수 있지만 커널 OS를 공유하기 때문에 보안 측면에서는 가상머신에 비해 떨어질 수 있다.

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글