Docker 공식문서 핥아보기 (1) - OverView

2020. 4. 23. 19:37Dev/Docker

가상 Containor 시스템인 Docker.

장점에 대해서는 많이 들었고 관심있을때마다 그냥 들춰는봐서 뭔지는 알겠는데

체계적으로 정리를 해본적이 없다!

 

역시 기술의 근본, 공식문서와 Getting Started를 해보며 내것으로 만드는 시간을 가져보자.

 

Docker 공식 Doc : https://docs.docker.com/get-started/overview/

 

Docker overview

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you...

docs.docker.com

 

1. Docker 핥기

이전에도 가상화라는 개념은 있었다. Host OS 위에 VM을 통해 Guest OS를 띄워 사용하는 형태였다.

하이퍼바이저를 통해 OS를 올리기 때문에 부하가 있는 편이었다.

하지만 Docker는 지정된 Host에서 Guest OS 없이 Docker 엔진으로 여러 컨테이너를 동시에 실행할 수 있다.

호스트 시스템의 커널 내에서 직접 실행되므로 VM에 비해 가볍다!

GuestOS 대신 Docker 엔진이 있다. 오버헤드가 적다.

 

2. Docker 엔진

Docker는 서버-클라이언트의 구조이다.

사용자는 Docker CLI에서 명령을 입력하면 Rest API로 Docker Daemon 서버로 보낸다.

로컬에 Docker 깔고 그냥 실행해도 실제로는 서버와 클라이언트 2개가 실행된것이다..!

(실제로 AWS에서 dockerd(daemon) 실행 없이 CLI만 실행해서 오류가 난 경험이 있다.)

그리고 Daemon은 이미지, 컨테이너, 네트워크, 볼륨 등 Docker 객체를 만들고 관리한다.

도커 엔진 공식 이미지

 

3. Docker 아키텍쳐

Docker 아키텍쳐 이미지. Client 분리환경 동작, Docker Hub(registry)를 추가로 표현했다.

- Docker 데몬(Dockerd)
 Docker API 요청을 수신하고 이미지, 컨테이너 등 Docker 객체를 관리한다. 데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수도 있다.

 

- Docker 클라이언트
 Docker 사용자가 Docker와 상호작용하는 기본 방법이다. docker run 같은 명령을 사용하면 클라이언트는 dockerd에 보내 명령을 수행한다. docker 명령은 Docker API를 사용하고 Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있다.

 

- Docker 레지스트리

 Docker 이미지를 저장한다. Docker Hub는 누구나 사용하는 공용 레지스트리이고 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있다. Docker hub에 개인 레지스트리를 업로드해 실행할 수도 있다.

docker pull, docker run, docker push 등 명령들은 존재하는 레지스트리에서 read/write 한다.

 

4. Docker 객체

- 이미지

 Docker 컨테이너를 만들기 위한 읽기전용 템플릿. 이미지는 다른 이미지를 기반으로 새롭게 만들어질 수도 있다. 이미지는 내가 만들거나 다른사람이 레지스트리에 등록해 놓은 이미지만 사용 할 수 있다. 자신이 만들고 싶으면 DockerFile을 작성해야 한다. DockerFile의 각 명령어는 이미지에 레이어를 만든다. 향후 이미지에 변경이 있을 경우 변경된 레이어만 재구성 된다. 이것이 Docker가 다른 가상화 기술보다 빠른 이유이다!

 

- 컨테이너
 컨테이너는 실행 가능한 이미지 인스턴스. Docker API, CLI를 통해 컨테이너 작성, 시작, 중지, 이동, 삭제 등 제어할 수 있다. 기본적으로 컨테이너는 host, 다른 컨테이너들과 잘 분리되어 있어 컨테이너별로 독립적으로 네트워크, 스토리지, 서브시스템 등을 관리할 수 있다. 컨테이너를 제거할 때 이미지로 저장하지 않으면 설정값은 모두 날아간다.

(공식홈페이지에 ubuntu 컨테이너 실행 실습이 있는데 아주 간단하니 해보면 좋다)

 

- 서비스

 서비스를 사용하면 여러 Docker 데몬에서 컨테이너를 확장할 수 있다. Swarm으로 함께 할 수 있으며 Manager와 Worker로 나뉘어진다.(요즘은 Docker swarm보다 오케스트레이션으로 쿠버네티스를 많이 사용하는것 같다)

Swarm의 구성원은 Docker 데몬이며 모든 데몬은 Docker API로 통신한다. 기본적으로 서비스는 모든 worker 노드에 로드밸런싱 된다. 소비자는 Docker 서비스가 하나의 프로그램인것처럼 느낀다.

 

5. Docker의 기본 기술

- NmaeSpace

pid네임 스페이스 : 프로세스 분리 (PID : 프로세스 ID)

net네임 스페이스 : 네트워크 인터페이스 관리 (NET : 네트워킹)

ipc네임 스페이스 : IPC 자원에 대한 액세스 관리 (IPC : 프로세스 간 통신)

mnt네임 스페이스 : 파일 시스템 관리 (MNT : Mount)

uts네임 스페이스 : 커널과 버전 분리 (UTS : 유닉스 시간 공유 시스템)

 

- Control Group

 

- UnionFS(연합 파일 시스템)

 

- 컨테이너 형식

 

이 부분들은 Docker 컨테이너를 어떤 기술로 나뉘느냐에 대한 이야기인데 아직 다루기에는 이른것 같다.

이제 용어나 사용기술에 대한 간단한 설명은 끝나고 설치, 실습 단계로 넘어가자!