장난감 연구소
[스터디] 컨테이너 기술 본문
본 게시글은 CS 지식 스터디에서 컨테이너 기술에 대해 발표하기 위해 정리한 내용입니다.
기본 개념
- 컨테이너란 무엇인가? 샌드박스화된 런타임 환경
- 애플리케이션과 파일/런타임 등 실행 환경을 같이 패키징한 것
- 애플리케이션 소프트웨어를 운영체제로부터 분리시켜 사용자에게 애플리케이션이 동작할 때 필요한 최소한의 실행 환경을 제공하는 것
가상화 기술과 더불어 컨테이너 기술은 클라우드 컴퓨팅 서비스의 핵심으로 부각되고 있다.
컨테이너로 패키징된 애플리케이션은 자신이 동작할 수 있는 환경을 포함하고 있기 때문에 쉽게 배포가 가능해진다.

장점
- 이식성 : 컨테이너가 모든 종속성을 포함하여 어디서든 동일한 환경에서 실행 가능
- 경량성 : VM(가상머신)보다 적은 리소스로 실행되며, OS를 공유하여 성능이 뛰어남
- 빠른 배포와 롤백 : 이미지 기반 배포로 신속한 배포와 롤백 가능
- 확장성과 오토스케일링 : 트래픽 변화에 따라 컨테이너 수를 확장 또는 축소 가능
컨테이너와 가상머신 비교
- 컨테이너는 가상화인가?
- 꼭 그렇지는 않다. 서로 영향을 미치지 않는 환경을 제공한다는 점은 유사하지만, 실제 컨테이너에는 가상머신별로 독립된 운영체제가 동작할 수 없다.
가상화는 가상머신에서 리눅스, 윈도우 등 서로 다른 운영체제를 올릴 수 있지만, 컨테이너는 호스트 OS와 운영체제를 공유한다.
애플리케이션이 동작되는 방식이 다르기 때문에 애플리케이션이 실행될 때 성능의 차이를 보인다. 네이티브와 도커(컨테이너), KVM(가상머신)의 성능 비교 결과는 이것와 같다.
가상머신을 사용할 지 컨테이너를 사용할 지는 제공하고자 하는 서비스 환경에 따라 선택할 수 있다.
- 컨테이너가 유리한 경우
- MSA (Micro-Service Architecture)
- 서버의 수 최소화를 목표하는 경우
- 클라우드 네이티브 애플리케이션
- 가상머신이 유리한 경우
- 모놀리식(Monolithic) 애플리케이션 - 모든 구성 요소가 하나의 코드베이스와 배포 단위로 통합된 구조
- 서로 다른 운영체제 필요
- 고정된 스토리지 시스템 필요
컨테이너 기술 역사
1. 초기 개념 (1970~2000년대 초반)
- 1979년: UNIX에서 chroot 도입 → 프로세스를 격리하여 독립된 파일 시스템 제공.
- 2000년대 초반: BSD Jail(FreeBSD), Solaris Zones 등 컨테이너 개념이 등장하여 운영체제 수준의 격리 제공.
2. 리눅스 컨테이너(LXC) 시대 (2000년대 중반~2010년대 초반)
- 2008년: LXC(Linux Containers) 등장 → cgroups와 네임스페이스 분리 기술을 활용하여 완전한 OS 수준의 컨테이너 환경 제공.
- 2011년: Google이 LMCTFY(Let Me Contain That For You) 공개 → 내부 컨테이너 기술 기반.
3. Docker 혁명 (2013년~현재)
- 2013년: Docker 출시 → 간편한 컨테이너 생성 및 배포가 가능해지며 컨테이너 기술이 본격적으로 확산.
- 2015년: 오픈 컨테이너 이니셔티브(OCI) 출범 → 컨테이너 표준화 시작.
- 2016년~현재: Kubernetes 등장 및 컨테이너 오케스트레이션 활성화, 클라우드 네이티브 환경에서 필수 기술로 자리 잡음.
현재 컨테이너 기술은 DevOps, 마이크로서비스, 클라우드 환경에서 핵심 기술로 활용되며 지속적으로 발전 중이다.
리눅스 컨테이너(LXC)
LXC(Linux Containers)는 리눅스 커널의 기능을 활용하여 애플리케이션을 가상화하는 기술로, 격리된 환경에서 프로세스를 실행할 수 있도록 지원한다.
- cgroup(Control Groups)
- 프로세스의 CPU, 메모리, I/O, 네트워크 등의 리소스 사용을 제한 및 관리하는 기능.
- 여러 컨테이너가 동일한 호스트에서 실행될 때, 특정 컨테이너가 과도한 리소스를 사용하는 것을 방지할 수 있음.
- 네임스페이스(Namespaces)
- 프로세스를 격리하여 개별적인 실행 환경을 제공하는 기능.
- 주요 네임스페이스 종류:
- PID 네임스페이스: 각 컨테이너에서 독립된 프로세스 ID 할당.
- NET 네임스페이스: 네트워크 인터페이스(예: IP 주소, 포트) 격리.
- MNT 네임스페이스: 컨테이너별 독립적인 파일 시스템 제공.
초기 Docker는 2013년 초기에 LXC를 기반으로 컨테이너를 구현했지만, 이후 자체적인 컨테이너 런타임(libcontainer
)을 개발하면서 LXC 의존성을 제거하였다.
도커 (Docker)
도커는 컨테이너 기술을 더 쉽게 사용할 수 있도록 만든 플랫폼으로, 컨테이너의 생성, 배포, 실행을 자동화해 개발 및 운영을 단순화했습니다.
핵심 개념
- 도커 이미지(Docker Image)
- 컨테이너를 실행하는 데 필요한 모든 파일과 설정을 포함한 템플릿.
- 동일한 이미지를 사용하면 어디서든 같은 환경을 유지할 수 있음.
- 도커 컨테이너(Docker Container)
- 도커 이미지를 실행한 독립적인 환경.
- 가볍고 빠르며, 여러 개의 컨테이너를 동시에 실행할 수 있음.
- 도커 허브(Docker Hub)
- 공식 및 사용자 제작 도커 이미지를 공유하는 클라우드 레지스트리.
- 필요한 애플리케이션을 빠르게 다운로드하여 사용할 수 있음.
- 도커 컴포즈(Docker Compose)
- 여러 컨테이너를 정의하고 실행하는 도구.
docker-compose.yml
파일을 사용해 손쉽게 다중 컨테이너 애플리케이션을 설정 가능.
도커 vs LXC
비교 항목 | LXC | Docker |
---|---|---|
목적 | 경량화된 VM 대체 | 애플리케이션 배포 및 실행 자동화 |
사용 편의성 | 직접 설정 필요 (비교적 복잡) | 명령어 기반으로 쉽고 직관적 |
이미지 관리 | 제공되지 않음 | 도커 이미지를 통한 환경 일관성 유지 |
오케스트레이션 | 직접 관리해야 함 | Kubernetes, Docker Swarm 등과 연계 |
도커와 Github Actions를 활용해 CI/CD (지속적 통합/배포) 환경을 만들 수도 있다.
쿠버네티스 (Kubernetes, K8s)
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 관리하고 오케스트레이션하는 오픈 소스 플랫폼으로, 대규모 분산 시스템의 배포, 확장, 운영을 자동화하는 데 사용된다.
등장 배경
- 컨테이너 기술이 대중화되면서, 여러 개의 컨테이너를 효율적으로 관리하는 필요성이 커짐.
- 수십, 수백 개의 컨테이너가 동작하는 대규모 시스템에서 이를 관리하고 스케일링하는 작업은 매우 복잡.
핵심 기능
- 컨테이너 오케스트레이션
- 여러 개의 컨테이너를 클러스터화하여 관리
- Pod 단위로 컨테이너 그룹을 묶어 관리
- 자동화된 배포 및 롤백
- 애플리케이션의 배포, 업그레이드, 롤백을 자동화하여 개발과 운영을 효율적으로 관리
- 스케일링(Scaling)
- 필요에 따라 애플리케이션의 컨테이너 수를 자동으로 늘리거나 줄이는 자동 스케일링 기능 제공
- 서비스 디스커버리 및 로드 밸런싱
- 컨테이너가 동적으로 추가되거나 제거될 때, 자동으로 네트워크와 로드 밸런싱을 조정
쿠버네티스는 컨테이너화된 애플리케이션을 효율적으로 운영하고 확장하는 데 필요한 핵심 도구이다. 특히, 클라우드 네이티브 애플리케이션, DevOps, CI/CD 파이프라인에서 중요한 역할을 하고 있으며, 다양한 클라우드 환경에서 컨테이너를 관리하고 오케스트레이션하는 데 널리 사용된다.
참고 자료 출처
노서영 저, 『모두를 위한 클라우드 컴퓨팅』, 제이펍(2022)
'CS 지식' 카테고리의 다른 글
[스터디] HTTP 커넥션 관리 (0) | 2025.03.24 |
---|---|
[스터디] 가상화 기술 (0) | 2025.03.09 |
[스터디] HTTP 기초 (URL과 리소스, HTTP 메시지) (0) | 2025.03.03 |
대칭 최소-최대 힙(SMMH) (2) | 2022.06.16 |
[알고리즘] 반복자 iterator (0) | 2019.06.30 |