이 이미지는 Docker를 사용하여 애플리케이션의 여러 구성 요소를 격리된 컨테이너로 배포하는 구조를 보여줍니다. 각 층을 기준으로 설명해 보겠습니다.
1. Infrastructure (인프라스트럭처)
- 가장 아래층은 실제 물리적 하드웨어 또는 클라우드 서버를 포함하는 인프라 계층입니다.
- 이 계층 위에 운영체제와 Docker를 설치하여 컨테이너를 구동합니다.
2. Host OS (호스트 운영체제)
- Docker는 다양한 운영체제(예: macOS, Windows, Linux)에서 작동합니다.
- 이 Host OS는 Docker 엔진이 실행되는 기반 환경을 제공합니다.
3. Docker Engine
- Docker Engine은 호스트 운영체제에서 작동하며, 실제로 컨테이너를 실행하는 역할을 담당합니다.
- Docker Engine은 각각의 컨테이너를 격리하고, 컨테이너 간 네트워크, 볼륨 공유, 자원 할당 등을 관리합니다.
- Docker는 가상 머신과 달리, 운영체제를 가상화하는 대신 애플리케이션과 해당 애플리케이션에 필요한 라이브러리만을 격리된 컨테이너로 실행합니다.
4. Bins/Libs (필요한 바이너리와 라이브러리)
- 각 컨테이너 안에는 해당 애플리케이션이 필요로 하는 바이너리와 라이브러리(
Bins/Libs
)가 포함됩니다. - 예를 들어,
NestJS
컨테이너는 NestJS 서버를 실행하는 데 필요한 Node.js 런타임과 라이브러리가 포함되어 있습니다. - PostgreSQL이나 MongoDB 컨테이너 역시 각각 데이터베이스 엔진을 구동하기 위한 라이브러리와 도구들이 포함되어 있습니다.
5. Application Containers (애플리케이션 컨테이너)
- 최상위 계층에는 실제 애플리케이션들이 격리된 상태로 실행됩니다. 각 애플리케이션은 독립적인 컨테이너로 실행되어, 서로 간섭 없이 동작합니다.
- NestJS 컨테이너: API 서버로 작동하며, 독립적으로 격리되어 있습니다.
- PostgreSQL 컨테이너: 관계형 데이터베이스 서버로서, NestJS 애플리케이션의 데이터 저장소로 사용될 수 있습니다.
- MongoDB 컨테이너: NoSQL 데이터베이스로, 역시 NestJS와 같은 애플리케이션에서 데이터 저장을 위해 사용할 수 있습니다.
- 각 애플리케이션은 필요할 때 네트워크를 통해 서로 통신할 수 있으며, Docker 네트워크 설정을 통해 IP 주소나 도메인으로 접근할 수 있습니다.
Docker 구조의 장점
- 격리된 환경: 각 애플리케이션이 독립적인 컨테이너에서 실행되기 때문에 충돌 없이 다양한 서비스를 한 서버에서 동시에 구동할 수 있습니다.
- 이식성: Docker 컨테이너는 어디서나 동일한 환경을 보장하므로, 개발 환경과 배포 환경 간의 차이를 최소화할 수 있습니다.
- 유연한 자원 관리: Docker를 통해 각 애플리케이션에 할당된 CPU, 메모리 등의 자원을 쉽게 관리하고, 필요 시 확장하거나 축소할 수 있습니다.
이와 같은 Docker 구조는 애플리케이션을 마이크로서비스로 관리할 때 특히 유용하며, 서비스 간의 독립성과 배포의 용이성을 보장해 줍니다.
이 이미지는 가상 머신(Virtual Machine)과 도커(Docker)의 차이점을 보여줍니다. 두 기술 모두 애플리케이션을 격리하여 실행할 수 있게 하지만, 각각의 구조와 작동 방식에 큰 차이가 있습니다.
1. Virtual Machine(가상 머신)
- Hypervisor:
- 가상 머신은 하이퍼바이저(Hypervisor)라는 소프트웨어 계층을 통해 운영됩니다. 하이퍼바이저는 물리적인 서버(호스트 OS)에서 다수의 가상 머신을 실행할 수 있도록 하며, 각각의 가상 머신이 서로 독립적으로 동작하도록 격리합니다.
- Guest OS:
- 각 가상 머신은 게스트 운영체제(Guest OS)를 포함하고 있어, 각 애플리케이션이 자신만의 운영체제와 환경에서 실행됩니다. 예를 들어, 하나의 가상 머신이 Linux를, 다른 가상 머신이 Windows를 실행할 수도 있습니다.
- 게스트 OS가 포함되어 있어 각 가상 머신은 독립적이지만, 전체 시스템의 리소스를 많이 사용하게 됩니다.
- Bins/Libs 및 Application:
- 각 가상 머신에는 해당 애플리케이션이 실행되는 데 필요한 바이너리와 라이브러리(
Bins/Libs
)가 포함됩니다. - 따라서 각 애플리케이션은 독립적인 운영체제와 환경에서 완전히 분리된 형태로 동작합니다.
- 각 가상 머신에는 해당 애플리케이션이 실행되는 데 필요한 바이너리와 라이브러리(
- 장점:
- 격리된 환경을 제공하므로 보안성이 뛰어납니다.
- 다른 OS를 동시에 실행할 수 있는 유연성이 있습니다.
- 단점:
- 게스트 OS가 각 가상 머신마다 존재하므로, 시스템 리소스(CPU, 메모리, 디스크 공간 등)를 많이 사용합니다.
- 가상 머신의 부팅과 실행 속도가 비교적 느립니다.
2. Docker(도커)
- Docker Engine:
- Docker는 Docker Engine이라는 도커 런타임을 통해 애플리케이션을 격리합니다. Docker Engine은 하이퍼바이저와는 다르게 운영체제를 가상화하지 않고, 애플리케이션과 필요한 라이브러리만 격리하여 실행합니다.
- Docker는 Host OS의 커널을 공유하며, 이를 통해 여러 컨테이너를 매우 가볍고 효율적으로 실행할 수 있습니다.
- Bins/Libs 및 Application:
- 각 컨테이너는 해당 애플리케이션이 필요로 하는 바이너리와 라이브러리(
Bins/Libs
)만 포함합니다. - 각 컨테이너는 호스트 OS의 커널을 공유하기 때문에, 가상 머신보다 훨씬 가볍고 빠릅니다.
- 각 컨테이너는 해당 애플리케이션이 필요로 하는 바이너리와 라이브러리(
- 장점:
- 게스트 OS가 없으므로 리소스 사용이 효율적입니다. 하나의 운영체제를 공유하여 빠른 속도와 적은 메모리로 여러 컨테이너를 실행할 수 있습니다.
- 컨테이너는 가볍고 부팅이 빠릅니다.
- 환경 일관성이 보장되어 개발 환경과 배포 환경이 동일하게 유지됩니다.
- 단점:
- 호스트 OS와 커널을 공유하기 때문에 가상 머신만큼의 완전한 격리는 어렵습니다.
- 다양한 OS를 동시에 실행하기가 어렵습니다. 예를 들어, 호스트 OS가 Linux라면 컨테이너도 Linux 환경에서만 실행할 수 있습니다.
차이점 요약
가상 머신 (VM) | Docker |
---|---|
Hypervisor를 사용하여 격리된 환경 제공 | Docker Engine을 사용하여 격리된 환경 제공 |
각 VM은 게스트 OS가 포함됨 | 각 컨테이너는 호스트 OS의 커널을 공유 |
리소스 사용이 많고 무겁다 | 리소스 사용이 적고 가볍다 |
부팅 속도가 느리다 | 부팅 속도가 빠르다 |
다양한 OS를 실행할 수 있다 | 호스트 OS의 커널을 공유해야 한다 |
결론
- Docker는 경량화된 애플리케이션 격리 방식으로, 빠른 배포와 적은 리소스를 요구하는 경우에 적합합니다. 특히 마이크로서비스 아키텍처에서 많이 사용됩니다.
- 가상 머신(VM)*은 완전한 격리가 필요한 경우 또는 서로 다른 운영체제를 동시에 실행해야 하는 상황에 유리합니다.
'배포' 카테고리의 다른 글
Docker 종류 (1) | 2024.11.07 |
---|---|
AWS EC2인스턴스로 배포하다 해킹당한썰 (0) | 2024.10.25 |
AWS 인스턴스로 배포해보기2 (1) | 2024.10.24 |
AWS EC2 인스턴스로 배포해보기1 (3) | 2024.10.23 |