도커, 컨테이너
Iaas 의 뛰어난 이식성과 PaaS의 저렴한 운영비용을 함께 누릴 수는 없을까
Last updated
Iaas 의 뛰어난 이식성과 PaaS의 저렴한 운영비용을 함께 누릴 수는 없을까
Last updated
전통적인 배포 방식에 따르면, 컴퓨터 하드웨어 위에 운영체제를 설치한 뒤, 곧바로 어플리케이션을 여러개 깔아서 사용한다.
문제는 어플리케이션 간에 서로 영향을 끼치기 때문에 하나의 어플리케이션을 깐다고 다른 어플리케이션에 문제가 발생할 수도 있다.
전통적인 배포 방식에서 발전한 것이 바로 가상화 배포 방식이다.
가상머신을 이용하여 배포하는 방식인데, 하드웨어 - 운영체제 위에 hypervisor 기술을 이용하여 여러개의 가상머신을 독립적으로 운영한다.
가상머신 : 컴퓨터의 모든 하드웨어적 부품을 소프트웨어의 형태로 모방한 것이다. CPU, memory 등이 모두 소프트웨어로 되어있어서 마치 하드웨어 부품을 조립하듯이 사용한다.
hypervisor : 하나의 시스템 상에서 여러개의 가상머신을 구동할 수 있도록 해주는 중간계층을 의미한다.
클라우드 역시 이러한 가상화 기술 덕분에 가능한 것이다.
전통적 배포에 비해서는 운영이 편리해졌지만, 가상머신마다 OS 를 설치해주어야 하는 불편함이 있다.
컨테이너 런타임을 이용하여 하나의 운영체제 위해 여러개의 컨테이너를 운영하는 방식을 말한다.
컨테이너는 코드와 코드를 실행하는데 필요한 모든 종속성(라이브러리 등)을 패키징 한 소프트웨어의 표준 단위를 말한다.
즉 컨테이너 = 코드 + 코드 실행에 필요한 모든 종속성 패키지
컨테이너 내의 "이미지"라는 파일에 모든 라이브러리 + 종속성을 포함하는 코드가 저장된다.
가상머신하고 유사해보이지만, 운영체제 격리 속성을 완화하여 가상머신과는 다르게 컨테이너 간에는 운영체제를 공유할 수 있으며, OS 를 매번 설치하지 않아도 되니, 훨씬 경량화 되어있고 빠르다.
즉, 컨테이너나 가상머신을 이용하면 비록 하나의 OS 위에서 프로그램이 돌아가지만, 마치 서로 다른 컴퓨터에서 설치되어 있다고 착각하게 된다.
컨테이너의 경우는 OS 를 공유하기 때문에 어플리케이션의 문제가 OS에 영향을 미치면, OS 에서 구동중인 전체 컨테이너의 문제로 발전할 가능성도 있다.
그렇다면 도커란 무엇인가...!
컨테이너 단위로 어플리케이션을 실행하는 기능을 제공하는 플랫폼이다.
위의 그림에서는 container runtime 에 해당한다고 볼 수 있다.
도커는 Iaas 의 뛰어난 이식성과 PaaS의 저렴한 운영비용을 함께 누릴 수 있도록 해준다.
기존 시스템에 대한 설치 절차는 Dockerfile 스크립트에 작성하고
배포 관련된 사항은 docker swarm 이나 kubernates 에 맞춰 작성하기만 하면 된다.
보통의 구성은 그래서 docker + docker swarm or docker + kubernates
아래와 같은 과정을 거쳐서 컨테이너를 만든다.
Dockerfile 을 빌드
도커 이미지를 생성하고 실행한다.
도커 컨테이너를 실행한다.
docker file : 컨테이너에 설치해야하는 패키지, 환경변수 등을 기록한 하나의 파일이다. (java 를 설치한 뒤, 어떤 스크립트 파일을 실행한다 등)
docker image : 도커가 도커 파일의 단계에 따라서 컴퓨터의 상태를 스냅샷으로 저장한 것을 말한다.
docker container : 도커가 이미지를 불러와 실행할 때, 생성된다. 실행중인 컨테이너는 이미지에 지정된 프로그램과 데이터를 사용해서 일반적인 실제 컴퓨터와 연결되어 사용 가능하다.
kubernates or docker swarm : 컨테이너화된 어플리케이션을 자동으로 배포, 스케일링 및 관리해주는 컨테이너 오케스트레이션이다.
Docker 는 클라우드 가상화 기술이다. IaaS도, PaaS 도 아니지만, 굳이 따지자면 PaaS 의 일부라고 볼 수 있다. 컨테이너 가상화 자체가 커널 레벨이 아니라, 운영체제레벨, 가상 머신의 가상화가 일어나는 레벨보다 하나 더 높은 추상화 계층에서 일어나기 때문이다.