기술정보

개발 인프라 자동화의 진화: 가상머신(VM)에서 Terraform(IaC)까지 🚀

배로만쌤(김인영) 2025. 4. 15. 15:28

개발 및 인프라 자동화 여정

소프트웨어 개발 여정에서 누구나 한 번쯤은 마주하는 악명 높은 문장이 있습니다. 바로 "제 컴퓨터에서는 잘 됐는데요..."입니다. 🖥️💥 이 한마디는 밤샘 코딩의 결과값을 무효로 만들고, 팀원 간의 협업을 꼬이게 만들며, 심지어는 배포 직전에 모든 것을 멈춰 세우기도 합니다. 왜 이런 일이 발생하는 걸까요? 바로 개발 환경의 차이 때문입니다.

개인 노트북, 개발 서버, 운영 환경... 이 모든 환경이 조금씩 다르기에 예상치 못한 오류가 발생하고, 개발자는 끊임없이 환경 맞추기에 시간을 쏟게 됩니다. 마치 각자 다른 레시피로 요리하는 것처럼, 재료는 같아도 결과물은 천차만별이 되는 것이죠. 🍲➡️🤷‍♀️

하지만 걱정 마세요! 이러한 "제 컴퓨터에서는..." 문제를 해결하고, 개발부터 운영까지 일관되고 효율적인 환경을 만들기 위한 자동화 기술은 끊임없이 발전해왔습니다. 마치 숙련된 요리사가 정확한 레시피와 도구로 완벽한 요리를 만들어내듯, 자동화된 개발 인프라는 우리에게 안정적이고 예측 가능한 환경을 제공해줍니다. 🧑‍🍳✨

오늘은 가상머신(VM)에서 시작하여 Docker 컨테이너, Kubernetes 오케스트레이션, 그리고 인프라 자체를 코드로 관리하는 Terraform과 IaC(Infrastructure as Code)에 이르기까지, 개발 및 인프라 자동화의 흥미로운 여정을 따라가 보겠습니다. 그리고 마지막에는 파이썬 코딩 연습을 위한 간단한 Docker 실습을 경험해보는 시간도 가질 거예요!

1. 초기의 해결사: 가상머신 (Virtual Machines, VMs)

개발 환경 문제를 해결하기 위한 초기 접근 방식 중 하나는 가상머신(VM)이었습니다. VM은 하드웨어 위에 하이퍼바이저(Hypervisor)라는 소프트웨어를 이용해 여러 개의 독립적인 운영체제(OS)를 통째로 실행하는 기술입니다.

  • 개념: 각 VM은 자체 OS, 커널, 라이브러리, 애플리케이션을 가지며, 마치 별도의 컴퓨터처럼 작동합니다.
  • 장점: 호스트 시스템 및 다른 VM과 완벽하게 격리되어 안정적인 환경을 제공합니다.
  • 단점: OS 전체를 포함하므로 이미지 크기가 크고, 부팅 시간이 오래 걸리며, 상당한 시스템 자원(CPU, 메모리)을 소모합니다. 여러 VM을 동시에 실행하기에는 부담스러웠죠.

2. 가벼움과 속도의 혁신: Docker 컨테이너

도커 허브 컨테이너 개념도 이미지출처: How to install Container Registry on Kubernetes Cluster ❘ by 8grams

 

VM의 무거움과 비효율성을 극복하기 위해 등장한 것이 바로 Docker로 대표되는 컨테이너(Container) 기술입니다. 컨테이너는 OS 전체를 가상화하는 대신, 애플리케이션과 그 의존성(라이브러리, 설정 등)만을 격리합니다. DockerHub에서 시스템 이미지를 다운로드 받을 수 있고 Dockerfile에 시스템을 정의해서 컨테이너를 만들 수 있습니다.

  • 개념: 호스트 시스템의 OS 커널은 공유하면서, 각 컨테이너는 독립적인 파일 시스템과 프로세스 공간을 가집니다. 마치 잘 포장된 애플리케이션 패키지와 같습니다.
  • 장점: OS를 포함하지 않아 이미지 크기가 훨씬 작고, 시작/중지 속도가 매우 빠르며, VM보다 훨씬 적은 자원으로 더 많은 컨테이너를 실행할 수 있습니다. 개발, 테스트, 배포 속도를 획기적으로 개선했죠.
  • 간단한 Dockerfile 예시:

# 베이스 이미지 선택 (예: Python 3.9의 가벼운 버전)
FROM python:3.9-slim

# 컨테이너 내 작업 디렉토리 설정
WORKDIR /app

# 컨테이너 실행 시 실행될 기본 명령어
# 여기서는 간단히 "Hello from Docker!"를 출력하는 파이썬 코드를 실행
CMD ["python", "-c", "print('Hello from Docker!')"]

3. 여러 컨테이너의 조화: Docker Compose와 Kubernetes

애플리케이션이 복잡해지면서 웹 서버, 데이터베이스, 캐시 등 여러 개의 컨테이너가 서로 통신하며 작동해야 하는 경우가 많아졌습니다. 이를 효율적으로 관리하기 위한 도구들이 등장했습니다.

  • Docker Compose: 단일 호스트에서 여러 개의 컨테이너를 정의하고 실행하는 데 사용되는 도구입니다. YAML 파일을 이용해 컨테이너 간의 관계, 네트워크, 볼륨 등을 쉽게 설정할 수 있습니다. 개발 환경이나 소규모 서비스에 적합합니다.
  • Kubernetes (K8s): 대규모 분산 환경에서 컨테이너화된 애플리케이션을 자동으로 배포, 확장, 관리하는 컨테이너 오케스트레이션 플랫폼입니다. 여러 서버(노드)에 걸쳐 컨테이너를 관리하고, 로드 밸런싱, 자동 복구(self-healing), 무중단 업데이트 등 복잡한 운영 작업을 자동화해줍니다. 오늘날 클라우드 네이티브 환경의 표준으로 자리 잡았습니다.

4. 인프라를 코드로 관리하다: IaC와 Terraform

컨테이너가 애플리케이션 환경의 표준이 되면서, 이제는 애플리케이션뿐만 아니라 그것이 실행되는 전체 인프라(서버, 네트워크, 스토리지, 데이터베이스 등) 자체를 자동화하고 관리하려는 요구가 커졌습니다. 이것이 바로 IaC(Infrastructure as Code) 개념입니다.

  • IaC (Infrastructure as Code): 인프라 구성을 수동으로 설정하는 대신, 코드를 작성하여 인프라를 정의하고 관리하는 방식입니다. 이를 통해 인프라 변경 사항을 추적하고, 반복 가능하며, 일관성 있는 환경을 구축할 수 있습니다.
  • Terraform: HashiCorp에서 개발한 대표적인 IaC 도구입니다. 특정 클라우드 제공자(AWS, GCP, Azure 등)에 종속되지 않고, 하나의 코드(HCL - HashiCorp Configuration Language)로 다양한 클라우드 및 온프레미스 환경의 인프라 리소스를 관리할 수 있습니다.
  • 간단한 Terraform 코드 예시 (개념):
    (주의: 아래 코드는 개념 설명용이며, 실제 실행을 위해서는 AWS 계정 및 자격 증명 설정이 필요합니다.)

# 사용할 클라우드 제공자 설정 (예: AWS)
provider "aws" {
  region = "ap-northeast-2" # 예: 서울 리전
}

# 리소스 정의 (예: AWS S3 버킷 생성)
resource "aws_s3_bucket" "my_data_bucket" {
  bucket = "my-unique-terraform-demo-bucket-20250415" # 전역적으로 고유한 이름 필요

  tags = {
    Name        = "My Terraform Demo Bucket"
    Environment = "Development"
  }
}

위 코드는 terraform apply 명령을 통해 AWS에 실제로 S3 버킷을 생성합니다. 인프라 변경이 필요하면 코드를 수정하고 다시 적용하면 됩니다.

실습: Docker로 Python 실습 환경 만들기

자, 이제 이론을 넘어 간단한 실습을 통해 Docker를 직접 경험해 볼까요? 앞서 우리가 Jupyter Lab 환경을 Docker로 구축했던 것처럼, 이번에는 파이썬 프로그래밍 연습을 위한 간단한 Python 스크립트를 Docker 컨테이너에서 실행해보겠습니다.

데이터 분석이나 머신러닝을 시작할 때, 개발 환경 설정 때문에 어려움을 겪는 경우가 많죠? 라이브러리 버전 충돌이나 복잡한 설치 과정 때문에 시작도 전에 지치기도 합니다.

오늘은 이런 문제를 해결하고, 언제 어디서나 동일하고 깨끗한 개발 환경을 만들어주는 도커(Docker)를 이용해서 Jupyter Lab 환경을 쉽고 빠르게 구축하는 방법을 알아보겠습니다. 초보자도 쉽게 따라 할 수 있도록 차근차근 안내해 드릴게요!

왜 Docker와 Jupyter Lab을 함께 사용할까요?

  • 일관된 환경: 내 컴퓨터든, 동료 컴퓨터든, 서버든 어디서나 똑같은 환경에서 작업할 수 있어요. "제 컴퓨터에서는 잘 됐는데요..." 하는 상황을 피할 수 있죠!
  • 격리된 공간: 내 컴퓨터의 다른 프로그램들과 충돌 걱정 없이 필요한 라이브러리만 설치해서 사용할 수 있습니다.
  • 간편한 설치: 복잡한 설치 과정 없이, 명령어 몇 줄이면 데이터 분석에 필요한 기본적인 라이브러리(Pandas, NumPy, Scikit-learn 등)가 설치된 Jupyter Lab 환경이 뚝딱 만들어집니다.

준비물

  • Docker 설치: 가장 먼저 Docker가 여러분의 컴퓨터에 설치되어 있어야 합니다. 아직 설치하지 않으셨다면 Docker 공식 웹사이트에서 운영체제에 맞는 Docker Desktop을 다운로드하여 설치해주세요.

자, 준비가 되셨다면 이제 시작해볼까요?

단계별 따라하기

1단계: Docker 설치 확인 (이미 설치했다면 건너뛰세요!)

위에서 언급했듯이, Docker가 먼저 설치되어 있어야 합니다. 설치가 완료되었다면 다음 단계로 넘어가세요.

2단계: Jupyter Docker 이미지 다운로드 받기

소스가 있는 작업디렉토리로 이동합니다. 이 작업디렉토리는 도커 컨테이너내에 마운트되는 공유 폴더가 될 것입니다. 설명을 위해 다음 깃허브 소스 압축파일을 다운로드 받습니다. 그리고 압축을 풉니다.

https://github.com/Python-Crash-Course/Python101 

터미널(Windows에서는 PowerShell 또는 CMD, macOS/Linux에서는 Terminal)을 열고 아래 명령어를 입력해서 Jupyter Lab 이미지를 다운로드 받습니다. jupyter/datascience-notebook 이미지는 데이터 과학 작업에 유용한 여러 라이브러리들이 미리 설치되어 있어 편리합니다.

docker pull jupyter/datascience-notebook



이 명령어는 Docker Hub라는 이미지 저장소에서 해당 이미지를 내 컴퓨터로 가져오는 역할을 합니다.

3단계: Docker 컨테이너 실행하기

이제 다운로드 받은 이미지를 이용해서 Jupyter Lab 컨테이너를 실행할 차례입니다. 다음 명령어를 터미널에 입력하세요.

cd .\Python101

docker run -p 8888:8888 -v $(pwd):/home/jovyan/work jupyter/datascience-notebook

 

이 명령어가 조금 복잡해 보일 수 있으니, 각 옵션의 의미를 알아볼까요?

  • -p 8888:8888: 내 컴퓨터의 8888번 포트와 Docker 컨테이너 내부의 8888번 포트를 연결합니다. 이렇게 해야 웹 브라우저에서 Jupyter Lab에 접속할 수 있습니다.
  • -v $(pwd):/home/jovyan/work: 현재 내가 터미널에서 작업 중인 디렉토리(폴더)를 컨테이너 내부의 /home/jovyan/work 디렉토리와 연결(마운트)합니다. 이렇게 하면 컨테이너 안에서 만든 파일을 내 컴퓨터의 현재 폴더에서도 볼 수 있고, 반대로 내 컴퓨터의 파일을 컨테이너 안에서도 사용할 수 있습니다. 작업한 내용을 저장하고 보존하는 데 꼭 필요합니다!
  • $(pwd)는 현재 디렉토리를 의미합니다 (Linux/macOS 기준. Windows CMD에서는 %cd%, PowerShell에서는 ${PWD}를 사용할 수 있지만, 보통 $(pwd) 설명으로 통용됩니다).
  • jupyter/datascience-notebook: 실행할 Docker 이미지의 이름입니다.

4단계: Jupyter Lab 접속하기

컨테이너가 성공적으로 실행되면, 터미널 화면에 아래와 비슷한 형식의 URL 주소가 나타날 것입니다.

...
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
    http://127.0.0.1:8888/lab?token=abcdef1234567890abcdef1234567890
...

http://127.0.0.1:8888/lab?token=... 부분을 복사해서 여러분의 웹 브라우저 주소창에 붙여넣고 접속하면, 익숙한 Jupyter Lab 화면을 만날 수 있습니다! 이제 자유롭게 코드를 작성하고 실행해보세요. /work 폴더가 보인다면 3단계의 -v 옵션이 잘 적용된 것입니다.

/work폴더를 클릭하면 python101 폴더의 파일과 폴더들이 보일 것이고 아래와 같이 세션1의 쥬피터노트북 파일을 열 수 있습니다. 이렇게 열어서 파일을 실행하는 환경이 쥬피터랩입니다.

쥬피터랩 화면

5단계: Docker 컨테이너 중지하기

Jupyter Lab 사용을 마쳤다면, 실행 중인 Docker 컨테이너를 중지해야 합니다.

  1. Jupyter Lab을 실행했던 터미널 창에서 Ctrl + C 를 눌러 중지할 수 있습니다.
  2. 만약 터미널 창을 닫았거나 다른 작업을 해야 한다면, 새 터미널 창을 열고 다음 명령어를 입력하여 실행 중인 컨테이너 목록을 확인합니다.

  3. 출력된 목록에서 jupyter/datascience-notebook 이미지로 실행된 컨테이너의 CONTAINER ID (예: a1b2c3d4e5f6)를 확인합니다.
docker ps

아래 명령어를 이용해 해당 컨테이너를 중지합니다. <container_id> 부분에 방금 확인한 ID를 넣어주세요.

docker stop <container_id>


마무리하며

어떠신가요? Docker를 이용하니 정말 간편하게 Jupyter Lab 환경을 만들 수 있죠? 이제 복잡한 환경 설정 걱정 없이 데이터 분석과 프로그래밍 자체에 더 집중해보세요!

가상머신에서 시작하여 Docker 컨테이너, Kubernetes, 그리고 Terraform과 IaC에 이르기까지, 개발 환경과 인프라 관리 자동화 기술은 놀라운 속도로 발전해왔습니다. 이러한 도구들은 개발 생산성을 높이고, 안정적인 서비스 운영을 가능하게 하며, 복잡한 인프라를 효율적으로 관리할 수 있도록 돕습니다.

오늘 살펴본 기술들을 바탕으로 여러분의 개발 및 운영 환경을 더욱 스마트하게 만들어보세요!