서론
Node 서버를 만들다 도커를 사용해 Nodejs와 Nginx를 한번에 배포할 수 있는 방법을 보게 됐다.
AWS 프리티어가 만료 되서 아마 로컬 환경에서만 서버를 구동 할것 같지만 그래도 잼있어 보여서 도전해보려 한다.
Docker
단어 자체의 뜻은 항만에서 컨테이너를 싣는 것과 같은 일하는 노동자를 의미 하는데요, 컨테이너라는 말을 보니까 의미만 봐도 무언가를 싣는 것과 관련이 있어 보입니다.
소프트웨어를 빌드하고 Deploy(배포)할 때 각기 다른 환경에서 하게 된다면 엄청난 비효율이 발생하기 때문에 도커는 바로 이 컨테이너라는 독립적인 환경을 구성할 수 있게 해주는 오픈소스 프로젝트입니다.
도커도 가상화 기술의 한 종류인데 기존 가상화 비교했을 때 기술과 어떤 차이가 있고 어떤 장점이 있어 많은 사람들이 사용하고 있는지 알아보겠습니다.
Virtual Machines
기존 가상화 기술인 가상 머신은 Hypervisor를 사용해 여러개의 운영체제를 하나의 호스트에서 생성해서 사용했습니다.
그래서 하이퍼바이저에 의해 생성, 관리되는 운영 체제는 게스트 운영체제(Guest OS)라고 하며, 각 게스트 운영체제는 다른 운영 체제와는 완전히 독립된 공간에서 시스템을 사용합니다. 재학 중에는 VirtualBox를 사용해서 Hadoop을 사용해서 빅데이터 분석을 했던 기억이 나네요.
그러나 이런 가상 머신들은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다. 또한 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기가 커집니다.
Docker Container(도커 컨테이너)
도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용해 프로세스 단위의 격리 환경을 만들 수 있어 성능 손실이 거의 없습니다.
컨테이너에 필요한 커널을 공유하고 컨테이너 안에는 어플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하기때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상머신에 비해 대폭 줄어듭니다.
따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며 가상화된 공간을 사용할 대 성능 손실도 거의 없다는 장점이 있습니다.
Docker Architecture
도커는 내부적으로 클라이언트-서버 구조를 사용합니다. 도커는 Docker daemon이라 불리는 데몬을 실행하여 컨테이너와 관련된 모든 요청(빌드, 실행 등)을 처리합니다. 도커의 기본 CLI 클라이언트는 UNIX 소켓(default) 혹은 네트워크 인터페이스를 통해 도커 데몬으로 REST API 요청을 보내게 됩니다.
Docker Client
도커 서버와 통신을 수행한다. build, pull, run 등의 도커 명령어를 수행
Docker Daemon
도커 엔진이며 도커 데몬은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 등 도커 오브젝트를 관리
Docker Host
도커가 띄워져 있는 서버를 의미합니다. 이 곳에서 컨테이너와 이미지를 관리
Docker Registry
외부 이미지 저장소로 도커 이미지를 저장하는 저장소 역할을 합니다.
Images
도커에서 서비스 운영에 필요한 서버프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 하나로 묶는 형태를 말합니다. 사용자는 자신이 빌드한 도커의 이미지는 레이어(layer)를 중첩하는 방식으로 생성되기 때문에, 한번 빌드된 이미지의 중간 레이어는 캐싱되어 이후 다른 이미지를 빌드할 때 재활용 할 수 있다.
Containers
컨테이너는 이미지를 실행한 결과로 생성되는 인스턴스를 의미한다. 사용자는 도커 클라이언트의 명령어를 호출함으로써, 컨테이너를 관리할 수 있다.
'BACK END' 카테고리의 다른 글
Docker + Node.js + Nginx 3 (0) | 2023.12.11 |
---|---|
Docker + Node.js + Nginx 2 (0) | 2023.12.11 |
Node.js Multer (2) | 2023.12.10 |
HTTP multipart/form-data (1) | 2023.12.10 |
Nginx와 Node.js 쿵짝쿵짝 환경 구축하기 (0) | 2023.12.10 |