[Reference] Docker
Docker란 Go언어로 작성된 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
가상화를 사용하는 이유
서버 관리자 입장에서 CPU 사용률이 10%대 밖에 되지 않는 활용도가 낮은 서버들은 리소스 낭비일 수 밖에 없다.
그렇다고 모든 서비스를 한 서버안에 올리면 안정성에 문제가 생길 수 있다.
그래서 안정성을 높이며 리소스도 최대한 활용할 수 있는 방법으로 나타난게 서버 가상화다.
대표적인 가상화 플랫폼은 VM(OS 가상화)가 있다.
컨테이너
컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다.
기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS 레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.
VM 가상화 플랫폼 Vs Docker 가상화 플랫폼
VM은 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용한다.
가상화된 HW 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다.
반면에 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 된다.
OS 가상화는 Host OS와 완전히 분리되는 장점은 있지만, OS위에 OS를 올리기 때문에 무겁고 느릴 수 밖에 없다.
하지만, 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유한다.
커널을 공유하게 되면 I/O 처리가 쉽게 되어 성능의 효율을 높일 수 있다.
컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다.
- OS가상화는 컨테이너기반 가상화보다 더 높은 격리 레벨을 지원하기 때문에 보안적인 측면에서 더욱 유리하다.
- OS가상화는 커널을 공유하지 않는다.
- 커널을 공유하지 않는 만큼 멀티 OS가 가능하다는 것이다.
Docker 사용 이유
Docker를 사용하는 이유는 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성 때문이다.
Image
Image는 컨테이너 실행에 필요한 실행파일, 설정 값들을 가지고 있는 것으로 상태값을 가지지 않고, 변하지 않는다.
컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다.
같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 다른 것들을 설치할 필요가 없다.
새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고, 컨테이너를 생성만 하면 된다.
한 서버에 여러개의 컨테이너를 실행할 수 있고, 수천대의 서버도 문제없다.
Layer
Docker Image는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에, 보통 용량이 수백 MB에 이른다.
따라서, 기존 이미지에 파일 하나 추가했다고 다시 다운받는다면 매우 비효율적일 수 밖에 없다.
Docker는 이런 문제를 해결하기 위해 Layer라는 개념을 사용하고, 유니온 파일 시스템을 이용하여 여러개의 Layer를 하나의 파일 시스템으로 사용할 수 있게 해준다.
Image는 여러개의 읽기 전용 Layer로 구성되고, 파일이 추가되거나 수정되면, 새로운 Layer가 생성된다.
저장 방식
ubuntu image가 A
+B
+C
의 집합이라면, ubuntu image를 베이스로 만든 nginx image는 A
+B
+C
+nginx
가 된다.
webapp image를 nginx image 기반으로 만들면 A
+B
+C
+nginx
+source
layer로 구성된다.
만약 webapp 소스를 수정하게 되면 A
,B
,C
,nginx
layer를 제외한 새로운 source(v2)
layer만 다운 받으면 되기 때문에 효율적으로 image를 관리할 수 있다.
Docker Hub
Docker의 Image 용량은 보통 수백메가로, 이렇게 큰 용량의 image를 서버에 저장하고 관리하는 것은 쉽지 않다.
그래서 도커는 Docker Hub을 통해 공개 이미지를 무료로 관리해준다.
많은 개발자들이 docker hub 같은 public service를 이용하고 있지만, 기업에서는 다른 사람들이 프로젝트의 docker image를 쉽게 다운로드 받지 못하도록 보안 측면에서 private service(AWS, Google Cloud, Microsoft Azure)를 이용한다.
동작 방식
- 개발하고 있는 Local Machine와 Server에 Docker를 설치한다.
- 애플리케이션을 구동하는데 필요한 Dockerfile을 작성.
- Dockerfile을 이용해서 Image 생성(Build)
- Image를 Container Registry에 올린다.(push)
- Server에서 다운로드(pull) 받아서 컨테이너를 실행(run).
댓글남기기