1. Docker


[그림1] Docker

Docker란?

Docker컨테이너 가상화 기술을 기반으로 하는 오픈소스 플랫폼이다. 간혹 Docker가 컨테이너 가상화 기술을 개발한 회사라고 오해하는 경우가 종종 있는데, 컨테이너 가상화 기술은 Docker 이전에 이미 개발되어 존재했다. Docker는 최초의 컨테이너 기술LXC(Linux Container)에 여러 가지 중요한 기술을 가미하여 강력한 효율성과 유연성을 제공했다.

Docker는 컨테이너 가상화 환경 위에 애플리케이션 배포 엔진을 더하여 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있다. 게다가 요즘 널리 사용되는 MSA(Micro Service Architecture), CI/CD와 매우 잘 어울리기 때문에 각광받고 있다. 실제로 Docker는 한 컨테이너당 하나의 애플리케이션이나 프로세스를 실행하는 것을 권하고 있으니 이는 MSA의 철학과 일맥상통한다고 볼 수 있다.





2. Docker의 구조


Docker의 엔진은 클라이언트가 명령어를 서버에 전달하고 서버가 전달받은 명령어를 실행하는 Client-Server Architecture 를 사용하고 있다.

Docker 오브젝트를 관리하는 주체가 서버다. 오브젝트를 조작하기 위해 클라이언트가 명령어를 서버에 전달하면 서버의 dockerd(Docker daemon)라는 프로세스가 동작하여 해당 명령어 실행한다. 이러한 Client-Server Architecture 를 아래 그림과 같이 크게 세가지로 구분할 수 있다.

[그림2] Docker의 구조

클라이언트(Client)

클라이언트는 사용자가 Docker 오브젝트를 관리하기 위해 사용하는 가장 근본적인 수단이며 CLI(Command-line interface)를 제공합니다. 만약 사용자가 docker run 과 같은 명령어를 입력하면 해당 명령어를 수행하는 dockerd 프로세스로 전달한다. Docker 명령어는 Docker API를 이용하며 클라이언트가 한 개 이상의 dockerd 와 상호작용할 수 있도록 한다.

호스트(Host)

호스트는 Docker 오브젝트를 관리하는 주체이며 마치 운동장과 같다. dockerd라는 프로세스가 클라이언트로부터 전달받은 명령어를 실행하여 다양한 Docker 오브젝트를 관리하게 되는데, 이때 이미지, 컨테이너, 볼륨과 같은 Docker 오브젝트는 운동장에서 놀고 있는 학생들에 비유할 수 있다.

저장소(Registry) - DockerHub

Docker는 공식적으로 DockerHub라는 저장소를 지원한다. 마치 GitHub에 소스 코드를 저장하여 관리하는 것과 같이 이미지를 저장하여 관리할 수 있다. 또한 GitHub과 마찬가지로 Public, Private이 존재한다.





3. Docker Objects


Docker를 사용한다면, 이미지, 컨테이너, 볼륨 등 다양한 Docker 오브젝트를 활용하게 된다. 그중 가장 핵심이 되는 이미지(image)컨테이너(container)에 대해 알아보자.

이미지(Image)

이미지는 컨테이너를 생성하기 위해 필요한 템플릿이다. Docker에서 공식적으로 제공해주는 이미지가 있다. 사용자는 해당 이미지 혹은 다른 개발자들이 만들어 놓은 이미지를 사용하여 본인만의 커스텀 이미지를 만들 수도 있다.

예를 들어 Ubuntu를 기반으로 하는 커스텀 이미지를 빌드한다고 가정해보자. 아파치 웹 서버(Apache Web Server)와 나의 애플리케이션이 올바르게 동작할 수 있어야 한다면, 이는 단순히 Docker에서 제공해주는 공식 Ubuntu 이미지만으로 완성할 수 없다. 이때엔 기반이 되는 이미지(ex)Docker가 제공하는 Ubuntu 이미지)를 선택하고, 그 외에 필요한 것들은 이미지 안에 알맞게 추가하여 사용자만의 커스텀 이미지를 생성할 수 있어야 한다.

컨테이너(Container)

컨테이너는 이미지의 실행 가능 인스턴스다. 즉, 이미지를 실행시켜 컨테이너라는 가상화 공간을 만들게 된다. Docker만 올바르게 설치되었다면 어디서든지 저장소로부터 이미지를 가져와 컨테이너를 실행시킬 수 있다.





4. 그 외 Docker의 특징들


  • Logs - 로그는 현재 서비스의 상태를 파악할 수 있다. 때문에 어떠한 서비스를 운영하더라도 몹시 중요하다. 컨테이너는 stdout, stderr, stdin 을 통해서 생성되는 로그를 모두 수집하여 분석 혹은 trouble-shooting을 가능하게 해준다.
  • Resource Isolation and Grouping - 리눅스 커널의 Cgroups 기능을 통해 각각의 컨테이너마다 독립적인 CPU와 메모리가 할당될 수 있다.
  • 독립적 - 컨테이너는 독립된 파일 시스템이다. 컨테이너는 호스트와 완전히 분리된 프로세스 환경을 가지고 있으므로 독립적인 가상 네트워크 인터페이스와 IP 주소를 가질 수 있다.




5. 정리


  • Docker는 컨테이너 가상화 기술을 기반으로 하는 오픈소스 플랫폼이다.
  • Docker는 클라이언트가 명령어를 서버에 전달하고 서버가 전달받은 명령어를 실행하는 구조로 동작한다.
  • GitHub과 마찬가지로 Docker는 이미지를 저장할 수 있는 DockerHub를 공식적으로 지원한다.
  • 이미지는 컨테이너를 생성하기 위해 필요한 템플릿이며, Docker가 공식적으로 제공해주는 이미지를 커스텀 하여 사용자가 직접 이미지를 생성할 수도 있다.
  • 컨테이너는 이미지를 실행시켜 만들어 낸 가상화 공간이다.
profile
helloworld

0개의 댓글