Docker란?
Docker는 컨테이너를 생성하고 관리하기 위한 도구이다.
Docker의 시작
- Docker는 2013년 3월 산타클라라에서 열린 PYCON에서 Solomon Hykes가 ‘The future of Linux Containers’를 발표하면서 세상에 알려지게 되었다.
- Docker는 그렇게 Open source에 힘입어 전 세계적으로 큰 인기를 얻게 되었고 컨테이너를 실행하고 관리하는 ‘container runtime’ 도구로 사람들에게 알려지게 되었다.
- https://youtu.be/wW9CAH9nSLs?si=UBSMZsWSEIZKexjW
- 해당 링크는 Solomon Hykers의 발표 영상이다.
Container란?
컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지이다.
- 컨테이너: 표준화된 소프트웨어 유닛. 이는 기본적으로 코드 패키지이며 해당 코드를 실행하는데 필요한 종속성과 도구가 포함되어 있다. 도커가 실행되는 모든 곳에서 가져올 수 있다. 동일한 환경, 동일한 애플리케이션을 어떤 환경에서도 실행할 수 있다.
- 컨테이너 기술은 개인 데스크톱뿐만 아니라 기업 내의 on-premise 서버에서 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능하며, 확장성 또한 가지고 있다.
- 이를 통해 서버 구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발 자체에 집중할 수 있게 된다.
왜 독립적이고 표준화된 애플리케이션 패키지를 원할까?
- 다양한 개발 및 생산 환경
- 나중에 앱을 실행할 때와 정확히 동일한 환경에서 빌드하고 테스트할 수 있다.
- 팀/회사 내의 다양한 개발 환경
- 모든 팀원은 동일한 프로젝트를 수행할 때 정확히 동일한 환경을 가질 수 있다.
- 서로 다른 프로젝트 간의 도구/버전 충돌
- 프로젝트 간 전환 시 프로젝트 A에서 사용되는 도구가 프로젝트 B에서 사용되는 도구와 충돌할 수 있는 것을 예방할 수 있다.
- 개발과 생산에 대해 정확히 동일한 환경이 필요하다 → 이를 통해 테스트된 대로 정확히 작동하는지 확인할 수 있다.
- 신규 직원 및 동료와 공통 개발 환경/설정을 쉽게 공유할 수 있게 된다.
- 반복적으로 로컬 종속성 및 런타임을 설치하고 다시 설치하지 않아도 된다.
도커 컨테이너와 가상머신의 차이점
지금까지 설명한 것을 읽어보면 가상머신과 도커 컨테이너는 비슷하게 느껴질 수도 있다.
가상화 기술은 기존에 존재해 왔다. 하지만 기존의 가상화 기술과 어떤 차이점이 있는 것일까?
가상머신 Virtual Machine
기존의 가상화 기술인 가상머신은 하이퍼바이저(Hypervisor)를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었다.
하나의 호스트에서 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고 각 가상머신에는 우분투와 같은 운영체제가 설치되어 사용된다. 따라서 하이퍼바이저에 의해 성성되고 관리되는 운영체제는 Guest OS라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용하게 된다. 이러한 가상화 방식의 대표적인 도구는 VirtualBox, VMware 등이 있다.
각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 거쳐야 하기 때문에 일반 호스트에 비해 성능 손실이 발생한다. 또한 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 배포를 위한 이미지를 만들었을 때 용량이 커질 수밖에 없다.
- 가상머신은 Hypervisor를 통해 여러 개의 운영체제를 생성하고 관리됨 (Guest OS)
- 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 Hypervisor를 거치므로 성능 손실이 발생함
- Guets OS를 사용하기 위한 라이브러리, 커널 등을 포함하기에 배포 시 용량이 큼
Docker Container
도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 발생하지 않는다.
컨테이너에 필요한 커널을 공유해서 사용하고, 컨테이너 안에는 애플리케이션을 실행(run)하는 데 필요한 라이브러리 및 실행 파일만 존재하여 image로 만들었을 때 가상머신에 비해 매우 가벼운 용량을 가지게 된다.
- 도커 컨테이너는 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만들어 성능 손실이 발생하지 않는다.
- 커널을 공유해 사용하므로, 라이브러리 및 실행파일만 있기에 경량화된 사이즈
- 배포하는 시간이 가상머신에 비해 압도적으로 빠르며, 성능 손실 또한 거의 발생하지 않음
Docker | Virtaul Machine | |
부팅 시간 | 몇 초 안에 부팅 | VM이 부팅되는 데 몇 분 정도 걸릴 수 있음 |
실행 대상 | Docker는 도커 엔진을 사용 | VM은 하이퍼바이저를 사용 |
효율성 | 가상화하는 데 공간이 필요하지 않으므로 적은 용량 및 메모리 사용 | 전체 OS를 로드해야 하므로 효율성이 떨어짐 |
격리 | 컨테이너 기술은 호스트 커널을 공유하므로, 해커가 감염된 단일 애플리케이션을 통하여 커널 하위 시스템에 액세스 & 해킹할 수 있음 | 효율적인 격리 메커니즘으로 인해 간섭 가능성이 최소화 |
배포 | 컨테이너화된 단일 이미지를 모든 플랫폼에서 사용할 수 있으므로 배포가 쉬움 | 별도의 인스턴스가 실행을 담당하므로 배포 시간이 비교적 오래 소요됨 |
사용 복잡도 | Docker에는 타사 도구와 Docker 관리 도구로 구성된 복잡한 사용 메커니즘이 있습니다. | 도구는 사용하기 쉽고 작업하기가 더 간단합니다. |
Docker 특징
- 여러 계층의 Application을 컨테이너로 분리, 연결하여 실행하는 MSA (MicroService Architecture) 프로젝트에 유용하다.
- Application의 인프라는 image를 통해 제공하고 Public 혹은 Private 공유 가능하다.
- Github과 유사한 방식(open share)으로 Docker Hub에서 제공한다.
- 제공된 image를 기반으로 Application 서비스를 제공, 이를 컨테이너화 할 수 있다.
컨테이너 특징
- 컨테이너는 우리가 개발한 최소한의 image를 통해 실행되기에 경량이다.
- 컨테이너 이미지 생성의 Best Practice 중 하나는 이미지 경량화이다.
- 일반 서버 환경에서의 애플리케이션 실행과 달리 언제든 프로세스 수준의 속도로 빠르게 실행할 수 있고, 한 번에 여러 개의 컨테이너를 동시에 실행 가능하다.
- 개인 환경, 클라우드 환경 외에도 어떤 OS 환경에서도 동작 가능한 이식성을 보유하고 있다.
- 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버 관리 비용을 절감할 수 있다.
References
https://cloudacademy.com/blog/docker-vs-virtual-machines-differences-you-should-know/
https://techblog.lotteon.com/docker를-왜-써야되는가-2310117b4dea
https://nearhome.tistory.com/83
[Docker] 도커란? - 도커 개념 정리
도커란? 도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트 입니다. 도커는 일반적
seosh817.tistory.com
[쿠버네티스] 컨테이너가 뭐에요? (컨테이너의 기본 개념, 컨테이너 란?)
들어가며: 컨테이너가 뭐에요? 왜 컨테이너라고 부르죠? 컨테이너의 장점 컨테이너 아키텍처 도커 컨테이너 왜 (도커) 컨테이너를 써야하나요? 들어가며 : 컨테이너(container)가 뭐에요? 대충말하
nearhome.tistory.com
'Docker' 카테고리의 다른 글
#01 도커랑 친해기 / Play With Docker, PWD (0) | 2024.02.08 |
---|