Docker란?
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트
- Go 언어로 작성
- 가상 머신과 달리 도커 컨테이너는 성능의 손실이 거의 없음
- 도커 엔진
-> 컨테이너를 생성하고 관리하는 주체로 컨테이너 제어 등 다양한 가능을 제공하는 도커의 주 프로젝트
- 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해주는 플랫폼
컨테이너
- 격리된 공간에서 프로세스가 동작하는 기술
- 가상화 기술의 하나지만 기존 방식과는 차이가 있다.
-> 기존 가상화 기술은 하이퍼바이저를 이용해 여려 개의 운영체제를 하나의 호스트에서 생성하 사용하는 방식( 가상머신, VirtualBox, VMware )
-> 하이퍼바이저를 반드시 거치기 때문이 일반 호스트에 비해 성능 손실이 발생하고 이미지 크기 또한 커진다.
- 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능을 사용해 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.
- 필요한 커널은 호스트와 공유해 사용하고, 컨테이너 안에는 어플리케이션 구동에 필요한 라이브러리 및 실행파일만 존재
-> 이미지로 만들었을 때 이미지 용량 또한 대폭 감소
- 하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행
- 결론적으로 이미지 배포 시간이 빠르고 가상과 공간을 사용할 대의 성능 손실도 거의 없다.
이미지
- 컨테이너를 생성할 때 필요한 요소
- 가상 머신에서의 iso 파일과 비슷한 개념
- 컨테이너 실행에 필요한 파일과 설정 값들을 포함
-> 컨테이너를 실행하기 위한 모든 정보를 갖고 있다.
- 컨테이너는 이미지를 실행한 상태라고 볼 수 있다.
- 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않는다.
왜 Docker일까?
애플리케이션 개발 / 배포
- 도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간으로, 컨테이너 자체에 특별한 권한을 주지 않는 한 호스트 OS에는 영향을 끼치지 않는다.
-> 독립된 개발 환경을 보장 받을 수 있다.
- 컨테이너 내부에 작업을 마친 뒤 운영 환경에 배포하려고 하면 해덩 컨테이너를 도커 이미지라고 하는 패키지로 만들어 운영 서버에 전달하기만 하면 된다.
-> 편의성 향상 및 의존성을 걱정할 필요가 없어짐
-> 개발 / 운영 환경의 통합
- 가상 머신과 달리 커널을 포함하고 있지 않아 이미지 크기가 작다.
- 이미지 내용을 레이어 단위로 구성하며, 중복 레이어를 재사용할 수 있다.
-> 어플리케이션 배포 속도 최고
애플리케이션의 독립성 / 확장성
- 모놀리스( Monolith ) 어플리케이션?
-> 소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식
-> 서비스의 기능이 복잡해지고 거대해질수록 확장성과 유연성이 줄어듬
- 마이크로 서비스( Microservices )
-> 모놀리스 방식을 대체하기 위한 새로운 개념
-> 여러 모듈을 독립된 형태로 구성
-> 언어에 종속되지 않음
-> 변화에 빠른 대응
-> 모듈 관리의 용이함
- 컨테이너는 생성, 시작이 빠르고 여러 모듈에게 독립된 환경을 동시에 제공할 수 있기 때문에 마이크로 서비스 구조에서 가장 많이 사용되고 있는 가상화 기술이다.
Refernce
https://wikibook.co.kr/docker-kube-rev-ebook/
https://github.com/alicek106/start-docker-kubernetes
도커 귀여워요