[Docker] Docker란 무엇일까?
Docker 소개
2018년 현재 우리는 다양한 클라우드 인프라 환경속에 살아가고 있습니다. AWS, GCP 등의 다양한 클라우드 서비스를 통해 물리서버를 구매하기 보다는 사용한 요금만 내고 가상서버를 빌려 서비스를 합니다. 또한 물리서버를 구매해도 가상화를 통해 여러대의 가상서버를 구성하여 사용하기도 합니다.
클라우드 및 가상화 환경을 통해 가상서버를 1대가 되었든, 100대가 되었든 버튼 클릭 한번으로 생성할 수 있게되었습니다.
우리는 생성된 가상서버에 각종 소프트웨어 설치와 환경설정을 해야합니다. 가상서버가 1대 또는 2대일 경우 쉽게 하겠지만 100대가 넘는 서버에 소프트웨어를 설치하고 환경설정을 구성하여 배포하는 것은 큰 어려움으로 다가왔습니다.
이러한 상황에서 서비스 운영환경(소스코드, 컴파일된 바이너리 파일, 서버 프로그램 등)을 이미지화 하여 여러 서버에 배포한다면 100대가 넘는 서버의 운영환경을 설정하는 것은 큰 문제가 안될 것입니다.
Docker는 어떤 어플리케이션이든 쉽게 배포 패키지를 만들고 어떠한 환경에서든 배포할 수 있으며, 신속하게 돌아가는 조직의 개발환경 절차를 효과적으로 수행할 수 있도록 도와주는 도구(Tool)입니다.
Virtual Machine은 Host OS에 Guest OS에서 동작하지만 Docker는 Host OS에서 동작합니다.
아래의 그림을 통해 Virtual Machine와 Docker의 차이점을 볼 수 있습니다.
Virtual Machine 기반
Host OS / Hypervisor OS 위에 Guest OS를 설치하여 독자적으로 돌아가는 가상 컴퓨터 시스템입니다.
Virtual Machine 기반의 단점은 가상서버의 성능이 좋지 못하다는 점 입니다. 물론 하드웨어 성능이 발전하며 가상서버를 위한 많은 기능들이 추가되었지만 물리서버에 비해 많이 느립니다. 또한 가상서버는 항상 Guest OS를 설치해야 작동할 수 있으므로 가상서버 이미지의 용량 또한 큽니다.
Docker 기반
Docker는 가상서버 처럼 Guest OS를 설치 하지 않습니다. Docker 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리하여 설치할 수 있고 OS 자원은 호스트서버(물리서버)와 공유합니다. 따라서 OS를 설치할 필요가 없으므로 이미지의 용량 또한 크게 줄어듭니다.
Docker는 하드웨어를 가상화 하는 계층이 없으므로 시스템 처리 속도가 가상서버에 비해 물리서버를 그대로 사용하는 것처럼 월등히 빠릅니다. 또한 가상서버와는 달리 이미지 생성과 배포에 특화된 이미지 버전관리를 제공합니다.
Docker Hub
Docker는 Docker Hub란 것을 제공함에 따라 Docker Image를 쉽게 업/다운로드 할 수 있으며 공유할 수 있습니다.
Docker 작동방식
Linux에는 Chroot라는 명령어가 있습니다. 루트 디렉토리를 변경하는 명령어로써 특정 디렉토리를 Chroot 명령어로 통해 루트 디렉토리로 변경할 수 있습니다.
Chroot 명령어로 특정 디렉토리를 루트 디렉토리로 변경할 경우 특정 디렉토리의 Chroot Jail(감옥) 환경이 생성됩니다. Chroot Jail 환경에서는 바깥(루트 디렉토리로 설정한 특정 디렉토리 이외의 디렉토리)의 파일과 디렉토리에 접근할 수 없습니다.
Chroot는 디렉토리 경로를 격리하기 때문에 서버에 대한 정보유출과 피해를 최소화 하는데 사용했습니다.
Chroot Jail 환경이 생성될 경우 이외의 디렉토리로 접근할 수 없습니다.
하지만 Chroot는 Chroot Jail에 실행 파일과 공유 라이브러리를 직접 준비하며 설정하는 방법이 번거로우며 완벽한 가상화 환경이 아니기 때문에 각종제약을 받았기 때문에 LXC(Linux Container)라는 시스템 레벨의 가상화 공간을 제공하였습니다.
LXC는 서버전체를 가상화 하여 OS를 실행하는 것이 아닌 리눅스 커널 레벨의 가상화 된 공간입니다.
이 가상화 된 공간에는 OS가 설치되지 않기 때문에 Container라고 명칭합니다.
리눅스 커널의 Control Groups(cgroups)는 CPU, 메모리, 디스크, 네트워크 자원을 완전한 형태의 가상 공간으로 제공하고 또한 프로세스 트리, 사용자 계정, 파일시스템 등 호스트와 별개의 공간을 생성하게 됩니다. 이것을 Namespaces라고 합니다.
Docker는 리눅스 커널의 cgroups와 namespaces를 기반으로 하여 작동하고 0.9버전 이후로는 LXC를 대신하는 libcontainer를 개발하여 사용하고 있습니다.
Docker 이미지 / 컨테이너
Docker에는 이미지와 컨테이너라는 단어가 존재하며, 이미지에는 Base 이미지와 Docker 이미지가 있습니다.
Base 이미지
커널 영역을 제외한 사용자 공간 / 영역만을 이미지에 포함한 파일을 의미합니다.
각각의 OS의 원본영역을 이미지화 한 것이라고 볼 수 있습니다.
Docker 이미지
Base 이미지에서 몇가지 라이브러리, 프로그램, 소스파일 등을 추가/설치/저장한 이미지를 말하며 Base 이미지에서 추가 커스텀한 영역을 이미지화 한 것이라고 볼 수 있습니다.
컨테이너
Docker 컨테이너란 이미지가 실행된 상태를 말합니다. 이미지 하나로 수백개의 컨테이너를 생성할 수 있습니다.
'Server > Docker' 카테고리의 다른 글
🐳 Docker 도커 - #1 기본 명령어 모음 (0) | 2021.05.18 |
---|---|
Docker 명령어 정리 (0) | 2021.05.18 |
[Docker] 란 ? VM과 차이, Docker 설치 및 기본 명령어를 중심으로 (0) | 2021.03.25 |
[Docker] 란? (0) | 2021.03.22 |
[Docker] - Docker란 무엇이고 왜 사용했는가? (0) | 2021.03.22 |
댓글