많은 기업들은 인프라 운영의 효율성을 위해 클라우드 네이티브 환경을 구축하고 있으며, 그 중심에는 도커(Docker)와 쿠버네티스(Kubernetes)가 있다.
대규모 엔터프라이즈 환경에서 사용되는 기술 스택을 중심으로, 도커와 컨테이너 기술의 핵심 개념과 운영 생태계에 대해 알아보자.
1. 기업형 클라우드 인프라의 예
기업들은 단순히 서버를 돌리는 것에 그치지 않고, 인프라 전체를 소프트웨어로 정의하고 자동화한다.
- 가상화 및 네트워크: 물리 서버에 VMware를 설치한 후, 그 위에 OpenStack을 얹어 사내 클라우드를 구축한다. 이때 하드웨어 장비 없이 소프트웨어(스위치, 라우터)만으로 네트워크를 연결하는 SDN 기법이 활용된다.
- 패키징 및 배포: Docker로 환경을 구성하고, Helm이라는 쿠버네티스 전용 패키지 매니저를 통해 서비스 설정과 배포를 관리한다.
- 모니터링 체계: Prometheus가 인프라 내부의 정보를 수집(Metric)하면, 시각화 도구인 Grafana가 이를 대시보드 형태로 제공하여 실시간 모니터링을 가능하게 한다.
- 인프라 자동화: Terraform을 사용하여 코드로 인프라를 구축(IaC)함으로써 수천 대의 서버 환경을 자동화한다.
2. 도커(Docker)와 컨테이너 기술의 핵심
도커는 2013년 등장한 Go 언어(Golang) 기반의 컨테이너 가상화 도구다.
기존의 가상머신(VM)과는 구조적으로 큰 차이가 있다.
리눅스 커널과 프로세스 격리
도커 이미지 API는 리눅스의 계층화된 파일 시스템을 기반으로 작동한다. 핵심은 외부 호스트(리눅스)의 CPU 프로세스를 각각 격리하는 것이다. 외부 OS에서 볼 때 수많은 도커 컨테이너들은 각각 독립적인 CPU 프로세스일 뿐이다.
데이터의 흐름과 영속성
도커 이미지는 호스트의 프로세스일 뿐이므로, 컨테이너 내부에 직접 데이터를 영구적으로 저장하는 구조가 아니다. 따라서 실행 시 환경변수(Environment Variable) 값을 외부에서 입력받아 컨테이너 내부에 적용하는 방식을 주로 사용하며, 특정 시점의 컨테이너 상태를 다시 이미지로 재생성(Commit)하여 CI/CD 공정에서 재사용하기도 한다.
라이브러리와 모듈화
일반적인 앱 개발은 Python, Java 등 다양한 언어와 수많은 라이브러리, 프레임워크를 사용한다. 버전 충돌이나 보안 패치 등의 복잡한 문제를 해결하기 위해 도커는 앱 실행에 필요한 함수 집합인 Library(코드 블록)들을 통째로 컨테이너화(Containerization)하여 이미지 하나로 모듈화시킨다.
도커 컨테이너의 주요 특징 요약
- 프로세스 격리: 도커 컨테이너는 호스트 OS 입장에서 보면 하나의 독립된 CPU 프로세스로 동작한다.
- 계층화된 파일 시스템: 이미지는 레이어 구조로 되어 있어 중복을 최소화하고 효율적으로 관리된다.
- 상태 비저장(Stateless): 컨테이너는 기본적으로 데이터를 저장하지 않는다. 따라서 환경 변수를 통해 설정값을 주입하거나, 외부 볼륨을 연결하여 데이터를 관리한다.
- 이식성: "한 번 빌드하면 어디서든 실행된다(Build once, run anywhere)." 개발 환경의 라이브러리와 설정을 이미지에 포함하므로 환경 차이로 인한 오류를 방지한다.
VM vs Container 비교 요약
| 구분 | 가상머신 (VM) | 컨테이너 (Container) |
| 핵심 기술 | Hypervisor 기반 가상화 | 리눅스 커널(cgroups, namespaces) 격리 |
| 게스트 OS | 각 VM마다 독립적인 OS 포함 (무겁고 느림) | OS 없이 호스트 커널 공유 (가볍고 빠름) |
| 실행 속도 | 분 단위 (부팅 필요) | 초 단위 (프로세스 실행) |
| 오버헤드 | 높음 (하드웨어 에뮬레이션) | 낮음 (호스트 리소스 직접 활용) |
| 목적 | 서비스 안정성 및 OS 완전 격리 | 빠른 배포, 확장, CI/CD 최적화 |
오버헤드 크기 비교: Hypervisor > VM > Container 순으로 시스템 부하가 크다. 즉, 컨테이너가 가장 가벼운 클라우드 최적화 모델이다.
3. 컨테이너 생태계의 계층 구조 (OSI모델과 유사)
컨테이너 기술은 물리 계층부터 사용자 워크플로우까지 체계적인 계층을 이룬다.
| 계층 | 역할 | 주요 도구/기술 |
| L6 (WorkFlow) | 사용자 작업 흐름 및 UI | Docker Cluster, OpenShift |
| L5 (Orchestration) | 컨테이너 스케줄링 및 관리 | Kubernetes, Docker Swarm |
| L4 (Container Engine) | 컨테이너 실행 및 생성 | Docker, containerd, RunC |
| L3 (OS) | 호스트 운영체제 | Ubuntu, CentOS, RHEL |
| L2 (Virtual Infra) | 가상화 인프라 | AWS, GCP, OpenStack, vSphere |
| L1 (Physical Infra) | 물리적 자원 | 서버 하드웨어, 네트워크, 스토리지 |
이렇게 계층화된 구조 덕분에 수많은 컨테이너가 모여 Cluster를 이루고, 이 클러스터들이 모여 Cloud가 된다.
4. CI/CD와 DevOps의 핵심: 자동화 파이프라인
도커는 개발부터 배포까지의 라이프사이클을 자동화함으로써 애자일(Agile) 방식과 DevOps 문화를 실현하는 핵심 도구다.
- CI (Continuous Integration): 개발자들이 변경한 코드를 정기적으로 빌드하고 테스트하여 공유 저장소에 병합하는 과정이다. "통합 지옥(integration hell)"을 방지한다.
- CD (Continuous Delivery/Deployment): 테스트가 완료된 코드를 실제 서비스 환경에 자동으로 배포하는 과정이다.
- Agile & SRE: 신속한 반복 작업을 통한 소프트웨어 개발(Agile)과 소프트웨어 엔지니어링 기법으로 시스템을 관리하는 SRE 팀의 협업을 통해 DevOps 문화가 완성된다. (주요 도구: Jenkins, GitLab, Bamboo, CircleCI, Teamcity 등)
5. 왜 컨테이너를 사용하는가?
- 높은 자원 효율성: 하나의 노드에서 수많은 컨테이너(Pod)를 실행할 수 있어 CPU와 RAM 사용률을 극대화하여 하드웨어를 효율적으로 사용한다.
- 빠른 실행과 배포: 이미 모든 설정이 완료된 상태로 배포되므로 설치/설정 작업이 획기적으로 줄어든다.
- 마이크로서비스 아키텍처(MSA) 최적화: 거대한 서비스를 작은 단위로 쪼개어 독립적으로 배포 및 관리할 수 있다. 특정 언어에 종속되지 않고 모듈별로 최적의 환경을 구성할 수 있다.
- 독립성: 동일한 Nginx 이미지를 100개 실행해도 각 컨테이너는 독립적이다. 한쪽에서 설정을 바꿔도 다른 쪽이나 호스트 OS에는 전혀 영향을 주지 않는다.
- 불변의 실행 환경 (Immutable Infrastructure): 한번 생성된 이미지는 변하지 않는다. 개발, 테스트, 운영 환경이 동일하므로 환경 차이에서 오는 버그를 원천 차단한다. ex. Java의 JVM처럼 특정 아키텍처나 서버 환경에 종속되지 않고 개발 환경에서 돌던 이미지가 운영 환경에서도 똑같이 돌아간다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 우분투에 도커 설치하기 (0) | 2025.12.26 |
|---|---|
| [Docker] 도커의 아키텍처와 동작 원리, 기술 동향 정리 (0) | 2025.12.26 |
| Hadoop 클러스터 구축하기 part.3 - 멀티 노드 띄우고 파일 업로드하기 (0) | 2025.12.23 |
| Hadoop 클러스터 구축하기 part.2 - SSH 키 기반 연결, 하둡 환경 설정 및 배포 (0) | 2025.12.23 |
| 가상환경에서 Hadoop 클러스터 구축하기 part.1 - 호스트네임, 네트워크 설정 (0) | 2025.12.22 |