본문 바로가기

공부

Docker 개념 및 핵심 설명, 왜 핫한가?

반응형

 

 

 

 

귀여운 고래친구

Docker 란, Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.

특징

- 모든 컨테이너들이 동일 OS 커널 공유(독립적 스케줄링이나 CPU/메모리/디스크/네트워크를 가상화 X)

- 리눅스 컨테이너 가상화(LXC) 기반

- 다른 OS에서는 일반 하이퍼바이저(경량)가 있어야 한다.

- 현재 LXC -> Libcontainer 사용하여 리눅스 의존도를 줄이려 한다.

- 구글의 Go라는 언어로 작성

 

가상화

보통 가상화를 한다고 하면, VMWare나 VirtualBox와 같은 것들을 이용하는 OS 가상화를 떠올린다. 이는 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식이다. 아래에 더 이야기를 할 것이지만, 단점은 호스트OS, 게스트OS간 기능 중복(프로세스 스케줄링), 무겁고, 배치의 어려움이 있다. 

이를 개선하기 위해 프로세스를 격리하는 방식이 등장한다.

 

도커는 Docker engine 위에 Application이 올라가 있다. 즉, 호스트 OS 위에 Docker Engine 위에 컨테이너가 생성된다.

컨테이너 기반의 가상화 기술은 아래와 같은 장점을 가진다.

1. 하드웨어 가상화가 아닌 실행 환경의 분리

2. 각 컨테이너간 영향 분리

3. 오버헤드 상대적으로 낮음

 

컨테이너

컨테이너라 하면 배에 싣는 화물 수송용 박스를 생각할 수 있는데, 각 컨테이너 안에 다양한 화물을 넣을 수 있고 쉽게 옮길 수 있다.

서버에서 이야기하는 컨테이너도 이와 비슷한데,

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

 

컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있다. 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.

 

*LXC란?

LXC = cgroups + namespaces

- cgroups(Control groups) : CPU, 메모리, 디스크, 네트워크

- Namespaces(Namespace Isolation) : 프로세스트리, 사용자 계정, 파일시스템 , IPC 등 호스트와 별개의 공간 설정

 

한 서버의 여러 OS를 가상화하여 사용하는 것 vs 컨테이너 방식으로 프로세스를 격리시켜 동작하는 방법

VM 같은 경우에는 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔젠, 그 위에 Guest OS를 올려 사용한다. 가상화된 하드웨어 위에 OS가 올라가는 형태로 Host와 분리된다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방한다. 

반면 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 된다. OS 가상화는 Host OS와 완전히 분리되는 장점이 있지만, OS 위에 OS ? 너무 무겁다.

우리가 기본 OS(Host OS)가 윈도우인데, VMware로 리눅스를 가상환경으로 띄우는거 컴퓨터 뜨거워지면서 느려진다..

하지만 컨테이너 기반 가상화는 Host OS, Docker 엔진 위에 바로 동작하며 Host 커널을 공유한다. 커널을 공유하면 I/O 처리가 쉽게 되어 성능 효율을 높일 수 있다.

즉, 컨테이너를 사용한다는 것은 가상 머신을 생성하는 것이 아니라, Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다.

 

OS 가상화는 컨테이너 기반 가상화보다 더 높은 격리 레벨을 지원하여, 보안적 측면에서 더욱 유리하다.

OS 가상화의 커널을 공유하지 않는 장점은, 멀티 OS가 된다. 

 

도커는 LXC를 기반으로 시작하여, Docker 0.9버전부터 직접 개발한 libcontainer 컨테이너를 사용하고 있다.

 

 

Docker를 쓰는 이유는 성능향상, 뛰어난 이식성, 쉽게 Scale Out 을 할 수 있는 유연성이라고 생각한다.

 

Docker image

: 컨테이너를 실행할 수 있는 실행파일, 설정 값 들을 가지고 있는 것, 상태값을 가지지 않고 변하지 않는다.

Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작한다.

컨테이너는 이미지를 실행한 상태로(컨테이너에는 추가되거나 변하는 값이 저장됨), 컨테이너 상태가 바뀌거나 삭제되었어도 이미지는 변하지 않고 그대로 남음

 

# Docker Archtecture

 

# 왜 핫한가?

컨테이너, 오버레이 네트워크, 유니온 파일 시스템 등 이미 존재하는 기술을 도커가 정말 잘 조합하고 사용하기 쉽게 만들었다.

레이어 저장방식

 

레이어 저장방식

문제의식] 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있어, 용량이 수백메가MB이다. 처음 이미지를 다운받을 때 크게 부담이 안되지만, 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받으면 매우 비효율적이다.

해결] 도커는 이런 문제를 해결하기 위해 레이어Layer 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다.

ubuntu 이미지가 A + B + C 의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성이 되며, 소스를 수정하면, A, B, C, nginx 레이어를 제외한 새로운 Source(v2) 레이어만 다운받으면 되기에 효율적으로 이미지를 관리할 수 있다.

 

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

 

 

이미지 경로

Docker Image를 Pull 받기 위한 URL이다. URL을 적지 않으면 default로 Docker Hub 에서 Image를 pull 받게되고 URL을 적어준다면 사설 저장소에서 이미지를 받을 수 있다.

이는 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다.

 

Docker File

: 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다. Docker File만 읽을 수 있다면, 해당 이미지가 어떻게 구성되어 있는지도 알 수 있다.

도커는 이미지를 만들기 위해, Docker File이라는 파일에 자체 DSL(Domain-specific language)언어를 이용하여 이미지 생성 과정을 적는다. 이 파일은 소스와 함께 버전 관리 되고 원하면 누구나 이미지 생성과정을 보고 수정할 수 있다.

 

 

Docker Hub & Docker Registy

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

Docker Hub에서는 이미지를 저장하고 관리해준다. 많은 회사들이 Docker 로 소프트웨어 배포를 시작했고, 공개 이미지들으르 공유할 수 있다. Docker Hub 를 이용하면 손쉽게 image 를 pull 받아 컨테이너에 적용 시킬 수 있다. (GitHub 동일하게 생각)

Docker Registry

Docker Hub 처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소를 구축할 수 있다.

 

 

 

참고 및 출처 :

- https://khj93.tistory.com/entry/Docker-Docker-개념

-https://hy2on.tistory.com/118

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

 

 

반응형