Docker(도커)에 대한 이야기는 익히 자주 들어서 '공부해야지..!' 매번 다짐했지만 미루고 미루다가 이제서야 정리할 기회가 와서 정리해봅니다:)
Docker란?
- 컨테이너라고 부르는 운영체제 수준의 가상화 방식으로 소프트웨어를 배포하는 방식을 사용하는 PaaS 제품이다.
- 애플리케이션, 데이터 단계만 사용자가 관리하는 서비스를 의미한다.
- 도커를 사용하면 다양한 개발 환경에서 컨테이너를 이용해 소프트웨어를 편하게 배포할 수 있다.
Docker을 사용하면 어떤 점이 좋을까?
-
소프트웨어를 배포할 때 "배포의 어려움"이 존재한다.
-
위의 그림과 같이 만약 소프트웨어A가 소프트웨어0 환경 버전이 3.0일때 작동하고, 소프트웨어B는 소프트웨어0 환경버전이 5.0일때 작동한다고 치자.
-
그렇게 되면 각각의 서버A/B에서는 소프트웨어A/B를 둘다 작동시킬 수 없을 것이다. (작동되는 환경 버전이 다르기 때문!)
-
위의 문제점을 해결할 수 있는게 바로 Docker 이다!
Container은 무엇일까?
- 소프트웨어를 배포할 때 필요한 코드, 라이브러리, 환경 설정 파일들을 한곳에 모아 격리시킨 후 실행 가능한 패키지로 만든 것이다.
- 서로 격리되어 있기 때문에 충돌이 나지 않는다.
- Container가 동일한 운영체제 위에서 작동하기 때문에 격리된 서로 다른 Container들끼리 통신을 주고받을 수 있다.
- 컨테이너가 동일한 운영체제 위에서 작동하면 가상머신에 비해 리소스 소모량이 적으므로 더 효율적인 리소스 관리가 가능하다.
가상머신에 비해 리소스 소모량이 적은 이유는 무엇일까?
1. 커널을 공유
컨테이너
- 컨테이너는 호스트 운영체제의 커널을 공유(=추가적인 운영체제를 실행할 필요가 없다는 것을 의미)한다.
- 커널을 위한 메모리와 CPU 리소스가 절약된다.
가상머신
- 가상머신은 각각 자체 운영체제와 커널을 포함한 전체 시스템을 실행해야 한다.
- 더 많은 메모리와 CPU 리소스를 소모하게 만듭니다.
2. 경량화된 가상화 계층
컨테이너
- 운영체제 수준의 가상화를 사용하여 애플리케이션을 격리한다.
- 경량화된 가상화 기술을 사용하여 더 적은 오버헤드를 발생시킨다.
가상머신
- 하드웨어 수준의 가상화를 사용하여 전체 운영체제를 격리한다.
- 하이퍼바이저와 같은 추가 계층이 필요하기 때문에 더 많은 오버헤드가 발생한다.
3. 빠른 시작/종료 시간
컨테이너
- 매우 빠르게 시작되고 종료될 수 있다.
- 시스템 리소스를 더 효율적으로 사용할 수 있게 해준다.
가상머신
- 전체 운영체제를 부팅하고 종료해야 하기 때문에 시작 및 종료 시간이 컨테이너 방식에 비해 길다.
- 그렇기 때문에 비효율적인 리소스 사용이 발생할 수 있다.
4. 파일 시스템 및 이미지 관리
컨테이너
- 계층화된 파일 시스템을 사용하여 이미지를 관리한다.
- 동일한 기본 이미지를 여러 컨테이너에서 공유하여 저장 공간을 절약할 수 있다.
가상머신
- 각각 독립된 디스크 이미지를 사용해야 하기 때문에 저장 공간의 낭비를 초래할 수 있다.
5. 네트워크 및 I/O 효율성
컨테이너
- 네트워크 및 I/O를 호스트 운영체제와 직접적으로 공유할 수 있어 효율적이다.
가상머신
- 가상 네트워크 인터페이스와 가상 디스크를 사용해야 하기 때문에 추가적인 오버헤드를 발생시킨다.
가상화에는 무엇이 있을까?
① HOST(호스트) 가상화
- 운영체제를 설치한 후 hypervisor를 통해 가상머신을 만들고 각 가상머신 내부에는 Guest OS가 설치된다.
- Hypervisor : 단일 물리 머신에서 다수의 가상 머신을 실행할때 활용하는 소프트웨어
② Hypervisor(하이퍼바이저) 가상화
- 호스트 가상화와 달리 HOST OS를 필요로 하지 않은 방식에 해당한다.
- 운영체제가 존재하지 않기 때문에 부팅시 가상머신을 선택하여 들어간다.
- 성능이 우수하지만, 초기설정이 복잡하고 관리가 어렵다.
③ Container(컨테이너) 가상화
- 운영체제 위에 Container를 운영하기 위해 필요한 Docker를 설치한 후 다수의 Container를 통해 application을 실행한다.
- Docker, Kubernetes(쿠버네티스)는 Container 가상화 방식을 활용하는 소프트웨어이다.
- Container간 격리가 되기 대문에 다른 application에 영향을 주지 않고, 서로 다른 컴퓨팅 환경에서 application을 실행하는데 용이하다.
Docker는 어떻게 구성되어 있지?
docker-cli(도커 클라이언트)
- 터미널같이 명령어 행으로 dockerd API를 활용해 build, run, pull과 같은 명령을 작성하는 곳이다.
- dockerd와 통신한다.
dockerd(도커 데몬)
- 백그라운드에서 실행되는 데몬 프로세스를 말한다.
- docker API 요청을 수신하고 Docker 이미지, Container 등과 같은 Docker 관련 객체를 관리한다.
- 데몬(demon)
- 운영체제에서 백그라운드에서 실행되는 프로그램(사용자와 직접 상호작용X)
containerd(컨테이너 런타임)
- Container 실행과 관리에 필요한 기능을 수행한다.
- Container의 생명 주기를 모두 관리한다.
- 생명 주기 => Docker 이미지 전송, Container 실행, 스토리지, 네트워크를 포함.
- Container 실행만 담당하는 runc과 다른 역할을 하며 고수준 Container Runtime에 해당한다.
container-shim
- containerd와 runc 사이에 작동하는 중간 프로세스이며, 중개자 역할을 한다.
- Container 실행을 조정하는 역할을 한다.(-> contianerd는 runc와 통신함으로 Container을 실행)
runc
- Container 실행과 관련된 작업을 수행하는 저수준 Container Runtime이다.