도커는 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.
항상 도커를 사용할 때는 먼저 도커 CLI에 커맨드를 입력한다. 그러면 도커 서버 (도커 Daemon)가 그 커맨드를 받아서 그것에 따라 이미지를 생성하든 컨테이너를 실행하든 모든 작업을 하게 된다.
예를 들어 도커 CLI에 docker run hello-world
를 입력해보자.
뭔지는 잘 모르겠지만 hello-world라는 프로그램이 실행됨을 확인할 수 있다.
플로우는 아래와 같다.
1. docker run hello-world
라고 CLI에 입력하면 도커 서버로 요청 보냄.
2. 서버에서 hello-world라는 이미지가 이미 로컬에 cache가 되어 있는지 확인.
3. 현재는 없기에 Unable to find image ~라는 문구가 2번째 줄에 표시.
4. 그러면 Docker Hub라는 이미지가 저장되어 있는 곳에 가서 그 이미지를 가져오고 로컬에 Cache로 보관.
5. 그 후 이제는 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성.
가상화 기술 나오기 전
하이퍼 바이저 기반의 가상화 출현
호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 OS 위에서 실행되며, 하드웨어 자원을 VM 내부의 게스트 OS에 흉내내는 방식으로 오버헤드가 크다는 단점이 있다. 하지만 게스트 OS 종류에 대한 제약이 없고 구현이 쉬워서 일반적으로 많이 사용한다.
Core 1에 에러가 생겨도 Core 2에 영향이 없다.
도커는 이러한 하이퍼 바이저 기반의 가상화 기술에 영향을 받아 탄생하게 되었다.
공통점
차이점
도커를 좀 더 자세히 알아보자
카카오톡, 노션 애플리케이션이 일정량의 하드디스크, CPU, memory와 함께 각각의 컨테이너에 격리되어있다.
그렇다면 어떻게 도커 컨테이너를 격리시킬 수 있을까?
먼저 리눅스에서 쓰이는 Cgroup(control groups)와 namespaces에 대해서 알아야 한다. 이들은 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다.
이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 가지고 있다. 대표적으로 다음 2가지가 있다.
다음은 이미지로 컨테이너를 만드는 과정이다.
First : Docker 클라이언트에 docker run<이미지> 입력
Second : 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드디스크에 옮김
Third : 이미지가 가지고 있는 명령어를 이용해서 카카오톡 실행
cgroup과 namespaces는 리눅스 환경에서 사용되는 것인데 어떻게 도커 환경에서도 쓸 수 있을까?
먼저 명령 프롬프트 창에 docker version
을 입력해보자.
분명 나의 호스트 pc os는 windows지만 linux라고 나와있다.
호스트 컴퓨터는 window/MacOS일지라도 도커 클라이언트와 도커 서버는 리눅스 VM 환경에서 돌아간다. 따라서 리눅스 커널을 통해 cgroup과 namespace를 쓸 수 있었던 것이었다.