Docker(도커)란? 왜 사용하는가?

Docker란?

Docker는 컨테이너 기반오픈 소스 가상화 플랫폼으로, 애플리케이션 및 그에 따른 환경을 격리된 컨테이너에 패키징하여 개발, 배포, 실행을 쉽게 지원하는 툴이다.

 

먼저 Docker를 이해하기 위해서는 가상화에 대해서 이해가 필요하다.

 

가상화란?

하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하는 방식이다.

 

하이퍼바이저

 

하이퍼바이저는 다음과 같은 역할을 수행한다.

  • OS들에게 자원을 나누어 주며 조율
  • OS들의 커널을 번역해서 하드웨어에게 전달

 

 

위 그림을 보면 하나의 Host OS에서 여러 개의 서버 운영 체제(게스트 OS)가 생성되어 있는 것을 볼 수 있다.

이렇게 생성된 게스트 OS들은 가상 머신이라는 단위로 구별되고, 다른 게스트 OS와는 완전히 독립된 공간과 시스템 자원을 할당 받아 사용한다.

 

얼핏보면 좋은거아니야?? 라고 생각할 수 있다. 하지만 이 가상화 방식은 아래와 같은 단점들이 존재한다.

서버 가상화의 단점
  • 각종 시스템 자원을 가성화하여 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능 저하가 발생한다.
  • 게스트 운영체제를 사용하기 위한 라이브러리, 커널들을 모두 포함하기 때문에 배포하기 위한 이미지를 만들었을 때 크 기가 커진다.
  • 각 가상 머신마다 독립된 운영체제를 가지고 있어서 추가적인 메모리 및 디스크 공간이 필요하다.
  • 게스트 운영체제별로 완전히 독립된 공간을 사용하기 때문에 서로간의 자원 공유가 불가능하다.

 

컨테이너란? 

기존 가상화의 대표적인 예로는 VMware, VirtualBox가 있다.

이런 가상머신을 사용하려면 처음에 OS 설치를 해야한다.

호스트 OS와 다르게 독립적으로 게스트 OS를 구축해서 동작하기 때문이다.

이 뿐만 아니라 실제 PC처럼 별도로 환경설정을 하는 등 세팅을 해줘야하기 때문에 시간도 소요된다. (메모리도 많이 잡아먹음)

 

반면에 컨테이너를 사용하면 이런 부분을 해결할 수 있다.

이제 컨테이너에 대해 알아보자.

컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만든다.

위 그림을 보면 기존 가상화와는 달리 컨테이너 엔진위에 컨테이너들이 할당되어 있는것을 볼 수 있다.

 

컨테이너안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하므로, 이미지를 만들었을 때 이미지의 용량이 가상 머신에 비해 훨씬 작다.

이미지의 용량이 작기 때문에 이미지를 만들어 배포하는 시간이 빠르고, 가상화된 공간을 사용했을 때 성능 손실도 거의 없다.

 

컨테이너 가상화의 대표적인 기술이 바로 Docker이다.

 

컨테이너를 왜 사용해야하나?

궁극적으로 어떠한 큰 장점이 있어서 컨테이너 가상화를 사용하는지에 대해 의문이 있을 수 있다. 이에 대해 알아보자.

이제 편의상 컨테이너에 대해서는 Docker라고 하겠다.

 

격리(Isolation)

Docker는 프로세스를 격리된 환경에서 관리한다.

격리된 환경이란 Host OS 와의 격리를 의미하며 컨테이너에 어떠한 설정을 하든  Host OS에 영향을 끼치지않는다.

우리만의 독립된 개발 환경을 보장받는 것이다.

Docker를 사용함으로써 프로세스를 컨테이너 단위로 사용할 수 있게 되어

각 애플리케이션과 그와 관련된 의존성 및 설정 파일 등을 완전히 분리하여 지원되어 이러한 격리로 인해 서로 다른 애플리케이션 간의 충돌 및 호환성 문제를 방지하는 등..

프로세스의 관리, 확장이 용이 해진다.

 

이식성(Portability)

Docker로 만들어진 컨테이너는 Docker가 설치된 모든 환경에서 동일하게 실행된다.

이를테면 개발을 진행한 로컬 환경의 애플리케이션다른 서버 환경으로 쉽게 옮겨 실행할 수 있게 한다.

 

경량(Lightweight)

Docker는 필요한 바이너리와 라이브러리만 포함하여 경량화되고, 호스트 커널과 리소스를 공유하여 더 적은 오버헤드로 실행할 수 있다.

 

버전 관리

Docker는 이미지 빌드와 배포를 위한 버전 관리를 제공한다.

이미지는 여러 레이어로 구성되며, 변경 사항에 대해 새로운 레이어를 추가하여 효율적인 빌드와 저장 상황을 제공한다.

 

커뮤니티 및 이미지 공유

Docker Hub를 통해 다양한 Docker  이미지를 제공한다.

또한 사용자는 자신만의 Docker 이미지를 만들어 공유할 수 있다.


Docker Image

Docker Image란 서비스 운영에 필요한 애플리케이션, 소스코드, 라이브러리, 실행파일, 설정 값들을 묶어서 가지고 있는 것이다.

즉, 애플리케이션을 행하기 위한 모든 요소를 포함하고 있는 것이다.

Docker 이미지들은 github과 똑같이 Docker Hub 사이트를 통해 버전관리 및 배포 Push, Pull이 가능하다.

 

Docker Hub 사이트에서 다양한 컨테이너 이미지를 사용할 수 있는데, 여기서 Nginx 도커 이미지를 다운받고 실행시키면 Nginx가 바로 실행되는 것이다.

 

도커 이미지에 대해 더 자세한 내용은 아래 링크를 참조.

 

[Docker] 도커의 레이어(Layer)에 대해 알아보자.

도커 이미지는 컨테이너를 만들기 위한 "압축파일" 개념이다. 이미지는 한번 만들어지면 이미지 내의 정보는 절대 변하지 않으며(불변성), 이미지를 통해 컨테이너를 만들 수 있다. 이 이미지는

hstory0208.tistory.com

 


DockerFile

도커 이미지를 만들기 위해서는 도커 파일이 필요하다.

도커 파일을 이용해 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다.

도커파일은 이미지를 생성하기 위한 스크립트 파일이다.

주로 텍스트 형식의 명령어들로 구성되어 있으며, 이를 사용하여 이미지 빌드 과정을 자동화하고 문서화할 수 있다.

도커 파일을 사용하여 이미지를 만드는 방법은 다음 포스팅에서 알아보자.

 

[Docker] dockerfile의 개념과 작성법에 대해 알아보자.

 

hstory0208.tistory.com


Docker Container

도커 컨테이너는 도커 이미지로 생성할 수 있으며, 도커 이미지와 컨테이너는 1 : N 관계를 갖는다.

즉, 하나의 이미지로 여러 컨테이너를 생성할 수 있는 것이다.

이미지를 실행하여 컨테이너를 생성하면, 도커 파일로 작성된 해당 이미지의 목적에 맞게 프로세스 단위의 격리 환경에 컨테이너가 생성된다.