도커란?
컨테이너 기반의 가상화 도구
프로젝트간의 충돌문제로 인해 서버의 성능을 나눠서 사용하는 개념에서 시작!
하나의 물리적 서버 호스트에서 여러개의 서버 운영 체제를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍처
하이퍼바이저
서버 가상화 기술을 구현할 수 있게하는 소프트웨어
여러개의 운영체제를 하나의 호스트 OS에 생성해서 사용할 수 있게 해주는 소프트웨어이다
가상 머신이라는 단위로 구별, 각 가상 머신에는 여러 운영체제가 설치된다.
이는 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제라고 부른다.
각 게스트운영체제는 다른 운영체제와는 독립된 공간과 시스템 자원을 할당 받아서 사용한다.
하이퍼 바이저는 OS들에게 자원을 나누어주며 조율하고, OS들의 커널을 번역하여 하드웨어에게 전달한다.
대표적 가상화 툴
: VirtualBox, VMware
단점
가상화 작업은 하이퍼바이저를 반드시 거쳐야 함(일반 호스트에 비해 성능 손실)
이미지 거대화(-> 게스트 운영체제 사용을 위한 라이브러리, 커널 등이 전부 포함된다.)
즉, 완벽한 운영체제를 만들기 위한 트레이드 오프가 발생한다.
프로세스 단위의 격리 환경
리눅스 자체기능인 chroot, 네임스페이스, cgroup을 사용함.
이미지의 용량이 줄어든다.
애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재한다.
이미지를 만들어서 배포하는 시간이 빠르고, 가상화된 공간을 사용할 때 성능 손실도 거의 없다.
컨테이너를 다루는 기술은 docker 말고도 다른 벤더사가 많지만 주로 docker engine을 사용하는 것!
컨테이너 기술은 도커만의 기술이 아니라는 점.
이미지의 실행, 배포가 빨라진다!
도커 = 컨테이너?
- 도커는 컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트이다!
컨테이너:
사전적의미로 어떤 물체를 격리하는 공간이다. 각각의 컨테이너는 격리된 상태로 다른 컨테이너들과 분리된다.
기술적의미로는 컨테이너에 담긴 무언가들에 대한 생성, 운영, 제거까지의 라이프 사이클을 얘기한다.
이미지 목적에 따라 생성되는 프로세스 단위의 격리 환경을 말한다.
SpringBoot 1개, Nginx 1개를 컨테이너에서 실행할 경우?
파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립적인 공간을 갖는다.
컨테이너가 실행되며, 프로세스가 실행되기에 필요한 자원들을 할당받고 프로세스를 실행한다.
이때, 커널을 통해 필요한 자원을 가져온다.
호스트 입장에서 컨테이너를 바라볼 때, SpringBoot를 애플리케이션 프로세스를 직접 실행하거나, 컨테이너로 실행하나 똑같은 프로세스로 바라본다.
결국 왜 컨테이너를 써야할까라는 질문에는
Host와의 격리된, 독립적인 개발 환경을 보장할 수 있고,
이를 통해 프로세스를 컨테이너 단위로 사용할 수 있고, 프로세스의 관리, 확장이 용이해진다는 장점이 있기 때문이다!
유저는 도커엔진을 통해서 컨테이너를 쉽게 사용할 수 있게 된다.
다음의 역할을 한다.
도커 데몬 (dockerd)은 컨테이너를 생성,실행, 이미지를 관리하는 주체이다.
도커 프로세스가 실행되어 입력을 받을 준비가 된 상태를 도커 데몬이라 부른다.
서버의 성능 자체를 업그레이드 시키는 것을 말한다.
자원의 확장성 측면이나 비용 측면에서 좋지 않은 해답인 경우가 많다.
자원이 효육적으로 사용되지 않을 수 있다.
여러대의 서버를 클러스터를 만들어 자원을 병렬로 확장하는 것을 말한다.
각기 다른 서버를 하나로 묶어 하나의 시스템같이 동작하게 하는 것.
클라이언트들에게 고가용성의 서비스를 제공하는 것을 말한다.
동일한 네트워크 풀을 쓰며, 요청에 따라 트래픽을 분산시킬 수 있다.
다만,
여러 대의 서버를 하나의 자원 풀로 만드는 것은 어렵다.
새로운 서버나 컨테이너가 추가됐을 때, 이를 발견하는 작업부터,
어떤 서버에 어떤 컨테이너를 할당할지 등 처리할 작업이 많다.
이러한 문제는 오픈 소스로 해결할 수 있게 되있는데
대표적인 것이 바로 도커 스웜이다.
스웜모드
마이크로 서비스 아키텍처의 컨테이너를 다루기 위한 클러스터링 기능에 초점.
필요에 따라 유동적으로 컨테이너 수를 조절.
컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원.
scale out은 기본적으로 지원하지만,
자체적으로 인스턴스를 늘리거나 줄이거나 할 수 는 없고,
개발자가 직접 늘려줘야한다.
구조
매니저 노드, 워커 노드로 구성
매니저 노드는 워커 노드를 관리하기 위한 도커 서버이다.
기본적으로 워커 노드의 역할을 포함한다.
매니저 노드를 여러개 두어 다중화함으로써 매니저 노드의 부하를 분산하고,
특정 매니저 노드의 다운에도 정상적으로 스웜클러스터를 유지할 수 있게한다.
AWS EC2의 4개의 인스턴스를 구성하고 그중 한개에 매니저 노드의 역할을 지정.
나머지는 워커노드로써 활용한다. 하나의 클러스터를 구축! -> 서비스 시작가능
서비스??
일반적인 도커 명령어의 제어 단위는 컨테이너이다.
이는 도커 클라이언트가 제어하는 것은 컨테이너라는 말!
도커 스웜에서 제어 단위는 서비스이다.
서비스는 같은 이미지에서 생성된 컨테이너의 집합을 의미한다.
위와 같은 구조에서 만약 노드에 장애가 발생하면,
테스크들에 대한 상태를 확인하고 있던 스웜이 서비스 내에 정의된 레플리카 수 만큼 스웜클러스터 내에 존재하지 않으면,
새로운 테스크 레플리카를 생성한다.
하지만, 매니저 노드가 다운되면 클러스터가 사라진다! (그래서 여러개를 둬서 안정성과 효율을 올리는 것)
결국 스웜 모드를 쓰는 이유는 서비스의 확장/관리의 편리성!
컴포즈는 도커 엔진의 밖에 위치한다.
컴포즈를 직접 설치해야 한다.
컨테이너의 생성을 편리하게 하기 위해!
쿠버네티스는 위와 같은 내용들을 편리하게 사용할 수 있게해주는 기술!
Reference : [10분 테코톡] ☂️ 검프의 Docker #이론편