개발기록장

[Docker] Docker 개념 간단 정리 본문

TIL/Docker

[Docker] Docker 개념 간단 정리

yangahh 2021. 5. 21. 19:58

 

 

도커란, 컨테이너 기반의 오픈소스 가상화 플랫폼 중 하나인데, 지금은 도커가 널리 쓰여지면서 컨테이너기반 가상화 플랫폼의 대명사처럼 되어버렸다.

 

여기서 컨테이너란 우리가 흔히 생각하는 화물들을 실어서 수송할 때 사용하는 그 컨테이너에서 착안한 개념이다.

서버에서 컨테이너를 사용하면 다양한 OS환경, 여러 프로그램들을 컨테이너에 실어 여러 곳으로 운반하여 배포할 수 있다.

즉, 도커를 사용하면(=컨테이너를 사용하면) 하나의 서버에서 각각의 서비스들이 서로 방해받을 일 없이 프로그램처럼 돌아가게 할 수 있다.

이런 독립된 컨테이너들은 Image 기반으로 만들어지고, 이 Image는 Docker(기업)에서 제공하고 있는 dockerhub라는 곳에 push/pull 해서 어디에서든 서비스를 배포할 수 있게 한다.

 

 

VM vs Container

도커는 하나의 가상 서버라고도 할 수 있다(사실상 컨테이너는 인프라이면서 프로그램 인 것이다).

그렇다면 이전에 많이 사용하던 VM(가상머신)들과는 어떻게 다른 것일까?

 

출처: https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms

 

- VM (Virtual Machines, 가상머신)

기존의 가상화 시스템인 VM은 host OS위에 설치된 hypervisor라는 프로그램(가상화 제어 프로그램) 위에서 동작한다.

VM은 hypervisor를 통해 그 위에서 수십개의 Guest OS를 돌리고, 하드웨어를 가상으로 할당해준다.
실제로 사용할 땐  Guest OS > Host OS > H/W 순으로 접근하게 된다.

 

이런 구조다 보니 실행이 느리고, 시스템의 리소스를 많이 잡아먹게 된다.

또한 호스트 서버가 내려갔을 시, 호스트 컴퓨터를 다시 부팅시키는 시간과 각 VM 부팅하는 시간이 더해져서 부팅만 하는 데에도 docker에 비해 오랜 시간이 걸린다.

뿐만 아니라, VM의 이미지에는 OS 이미지도 포함되어 있는데, 이 때문에 이미지 용량이 상당해서 배포와 관리를 힘들게 한다.

 

 

- Container

컨테이너 기반의 가상화 시스템(이하 도커)은 VM과 다르게 Host OS위에서 바로 동작한다.

도커는 hypervisor와는 다르게 Host OS와 커널을 공유하기 때문에 하드웨어 제어 부분을 같이 공유해서 쓸 수 있다.

도커 데몬은 호스트 OS가 무슨 종류이든지간에 호스트 OS의 커널에 접근해서 통역을 해준다. 

또한 커널을 공유하기 때문에 부팅이 없으며 마치 프로세스와 같이 메모리에 적재되어 실행된다. 

그래서 이미지를 실행하게되면 컴퓨터가 바로 실행되듯 플레이가 된다(부팅시간 없음).

 

이러한 장점들로 인해 도커를 사용하면 배포가 빨라지고, 서버가 망가져도 서버만 다시 실행시키고 이미지만 다시 실행하면 되서 복구 시간이 단축된다는 장점이 있다.

 

 

Docker의 구조

Docker는 아래와 같이 구분되어 있다.

  • Docker client와 server(server는 Docker engine, Docker daemon으로 불리기도 한다.)
  • Docker image
  • Docker registries
  • Docker containers

 

- Docker client와 server

Docker는 클라리언트와 서버 구조로 이루어져 있다. 

Docker 클라이언트는 Docker 사용자가 Docker 서버와 상호작용하게 하게 한다. 즉 우리가 docker run 과 같은 명령어를 입력하면 클라이언크가 API로 dockerd로 보내 도커를 실행시킨다. 여기서 dockerd가 Docker server(=Docker daemon 또는 Docker engine)이다. 

Docker 서버는 클라이언트에서 보낸 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다.

 

- Docker image

이미지는 컨테이너를 구성하는 파일 시스템과 실행할 어플리케이션의 설정 값 들을 포함하고 있는 것으로, 컨테이너를 생성하는 템플릿 역할을 한다. 

Docker 이미지는 'Dockerfile'에 명시된 것들을 기반으로 build라는 명령어를 통해 생성된다.

Docker 이미지의 특징은 Immutable(변하지 않음)하다는 것이다. 때문에 이미지를 통해 생성한 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.

 

- Docker registires

Docker registries는 Docker 이미지를 저장하는 '저장소'다. 소스코드를 github과 같은 저장소에 관리하듯, Docker 이미지는 Dockerhub와 같은 Docker registires에 저장한다고 생각하면 된다.

Dockerhub는 누구나 사용할 수 있는 공용 registry이며(github과 마찬가지로 public registry 가 있고 private registry도 있다) Docker는 기본적으로 Dockerhub에서 이미지를 찾는다.

registries 덕분에 이미지만 있으면 어디서든 배포가 가능하다.

 

- Docker container

Docker container는 Docker 이미지를 실행한 상태라고 볼 수있다. 추가되거나 변하는 값은 이미지가 아닌 컨테이너에 저장된다.

run이라는 명령어를 통해 이미지를 실행시켜서 컨테이너를 띄운다.

 

 

'TIL > Docker' 카테고리의 다른 글

[Docker] Dockerfile 작성법 간단 정리  (0) 2021.05.25