컨테이너란?
클라우드를 공부하며 항상 나오는 개념인 컨테이너, 그 개념을 정리해 보고자 작성하는 글입니다.
먼저 컨테이너의 정의를 살펴보겠습니다.
컨테이너는 실행에 필요한 모든 파일을 포함한 전체 실행(runtime) 환경에서 애플리케이션을 패키징하고 격리할 수 있는 기술입니다.
이와 같이 애플리케이션 코드를 가지고, 종속 항목을 포함하고 있습니다.
종속 항목에는 다음과 같은 것들이 있습니다.
- 실행하는 데 필요한 런타임(예를 들면, 자바나 파이썬 등)
- 실행하는 데 필요한 의존성(라이브러리 등)
정리해 보면, 컨테이너란 실행 가능한 애플리케이션과 실행 시 필요한 의존성들을 한꺼번에 패키징 한 것이라고 할 수 있습니다.
컨테이너를 활용해 애플리케이션을 다른 환경으로 쉽게 이동하고, 일관된 실행 환경을 제공할 수 있게 됩니다.
그렇다면 컨테이너는 왜 나오게 되었을까요? 그 배경에 대해 알아보겠습니다.
컨테이너가 나오게 된 과정
- 단일 가상 머신에서 여러 애플리케이션 실행
아래와 같은 경우를 살펴봅시다.
하이퍼바이저를 통해 하드웨어를 추상화하고, 그 위에 가상 머신이 올라가 있는 상황입니다. 가상머신 내에서는 두 가지의 애플리케이션이 실행되고 있으며, 종속 항목을 공유하고 있습니다.
하지만 이렇게 구현된 상황에서는 하나의 문제가 존재합니다. 애플리케이션 2가 버전이 업그레이드되어 그 버전에 맞게 종속 항목을 업데이트하게 되면, 애플리케이션 1의 버전과 호환이 되지 않을 수 있습니다.
- 가상 머신을 중심으로 위의 문제를 해결하는 법
위에 나왔던 문제인 종속 항목을 공유하는 문제를 해결하고자 물리적으로 가상머신을 격리한 상태입니다.
완전히 격리되어있기 때문에 하나의 가상 머신 내에 있는 애플리케이션에 대한 종속 항목이 변경되어도 다른 가상 머신 내의 애플리케이션에는 영향을 끼치지 않습니다.
하지만 이 구조에도 문제가 있습니다.
각 가상 머신이 하나의 하드웨어 위에서 동작하므로 일정한 리소스 할당과 관리가 필요하다는 것입니다. 예를 들어 하나의 OS를 가진 여러 개의 가상 머신을 띄운다고 생각해 보겠습니다. 그렇다면 OS의 중복 복제본이 발생하게 되고, 시스템의 리소스 낭비와 더불어 용량 낭비가 발생하게 됩니다. 이 문제는 가상 머신이 많이 실행될수록 더 심해집니다.
그렇다면 어떻게 해결할 수 있을까요?
- 사용자 공간 추상화 및 컨테이너
여기서 컨테이너라는 개념이 나오게 됩니다.
위 구조에서는 OS(커널)를 설치하고, 도커와 같은 컨테이너 런타임을 설치해 Host OS의 커널에서 제공하는 격리 기술을 사용할 수 있습니다. 예를 들면 Linux의 cgroups, namespace, chroot와 같은 기술들이 있습니다.
해당 개념들은 이번 글에서 다루지 않을 것이므로, 참조하실만한 링크를 하나 걸어놓겠습니다.
다시 돌아와서, 언급했던 자원 격리 기술을 이용해 Host OS는 컨테이너를 격리된 환경에서 실행하고 관리할 수 있습니다. 가상 머신보다 더 빠르고 가볍게 시작되며, Host OS의 자원을 효율적으로 사용할 수 있다는 장점이 있습니다.
마지막으로, 개발자들이 컨테이너를 선호하는 이유에 대해 알아보겠습니다.
개발자들이 컨테이너를 선호하는 이유
제가 앞서 말씀드렸던 컨테이너 기술을 적용하면 위 구조와 같게 됩니다.
개발 환경에서는 분명 잘 동작하며 테스트까지 모두 마쳤는데, 실 운영 환경에서는 에러가 발생할 수 있습니다. 버전 등이 문제가 될 수 있습니다. 하지만 컨테이너라는 기술을 사용하게 되면 필요한 종속성, 애플리케이션 코드들이 모두 패키징 되어 있기 때문에 컨테이너 런타임만 있다면 어느 환경에서든 똑같이 동작합니다. 이것이 바로 컨테이너의 장점입니다.
마무리
이와 같이 컨테이너에 대해 간단히 정리해보았는데, 정말 효율적인 기술이라고 생각합니다. 규모가 작은 서비스에서만 컨테이너를 운용해 보았는데, 실무에 들어가게 되면 쿠버네티스와 같은 컨테이너 오케스트레이션 도구로 큰 서비스를 MSA로 구축해보고 싶다는 생각이 있습니다. 틀린 점이 있다면 지적해 주시면 감사드리겠습니다!
참조
'Cloud' 카테고리의 다른 글
[Cloud] k8s(Kubernetes)의 대표적인 기능 (0) | 2024.05.20 |
---|