컨테이너화 및 오케스트레이션
컨테이너(Container) 는 애플리케이션과 그 실행 환경을 격리된 패키지로 묶어 일관된 실행 환경을 제공하는 기술입니다. 컨테이너는 호스트 운영체제에서 격리된 사용자 공간에서 실행되며, 필요한 라이브러리와 종속성을 포함합니다. 컨테이너를 사용하면 애플리케이션의 이식성과 일관성을 유지할 수 있습니다.
컨테이너 기술의 주요 필요성은 다음과 같습니다:
이식성 : 컨테이너는 애플리케이션과 그 실행 환경을 함께 패키징하므로, 어느 환경에서도 동일하게 실행될 수 있습니다.
격리성 : 각 컨테이너는 독립된 사용자 공간에서 실행되므로, 다른 컨테이너와 격리되어 자원을 사용할 수 있습니다.
효율성 : 컨테이너는 호스트 운영체제의 커널을 공유하므로, 가상 머신보다 더 경량화되고 빠르게 실행됩니다.
확장성 : 컨테이너는 필요한 만큼 빠르게 확장할 수 있으며, 오케스트레이션 도구를 사용하여 자동으로 관리할 수 있습니다.
Docker를 설치하고 기본적으로 사용하는 방법은 다음과 같습니다:
Ubuntu에서 Docker를 설치하는 방법은 다음과 같습니다:
# 기존 Docker 버전 제거
sudo apt-get remove docker docker-engine docker.io containerd runc
# 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Docker 설치 저장소 추가
echo "deb [arch=$( dpkg --print-architecture ) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $( lsb_release -cs ) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
Docker의 기본 명령어는 다음과 같습니다:
# Docker 버전 확인
docker --version
# Docker 서비스 시작
sudo systemctl start docker
# Docker 이미지 다운로드
docker pull hello-world
# Docker 컨테이너 실행
docker run hello-world
# 실행 중인 컨테이너 목록 확인
docker ps
# 모든 컨테이너 목록 확인
docker ps -a
# 컨테이너 중지
docker stop < container_i d >
# 컨테이너 삭제
docker rm < container_i d >
Dockerfile은 Docker 이미지를 생성하기 위한 스크립트입니다. 예를 들어, 간단한 Node.js 애플리케이션을 위한 Dockerfile은 다음과 같습니다:
# 베이스 이미지
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 종속성 파일 복사
COPY package*.json ./
# 종속성 설치
RUN npm install
# 애플리케이션 코드 복사
COPY . .
# 애플리케이션 실행
CMD [ "node" , "app.js" ]
# 컨테이너가 수신할 포트 설정
EXPOSE 8080
Docker Compose는 여러 컨테이너를 정의하고 실행할 수 있는 도구입니다. 예를 들어, 웹 애플리케이션과 데이터베이스를 함께 실행하는 구성 파일은 다음과 같습니다:
version : '3'
services :
web :
image : mynodeapp
build : .
ports :
- "8080:8080"
depends_on :
- db
db :
image : postgres:latest
environment :
POSTGRES_USER : user
POSTGRES_PASSWORD : password
POSTGRES_DB : mydb
Docker Compose를 사용하여 구성 파일을 실행하려면 다음 명령어를 사용합니다:
# Docker Compose 설치
sudo apt-get install -y docker-compose
# 컨테이너 빌드 및 실행
docker-compose up --build
Kubernetes 는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈 소스 플랫폼입니다. Kubernetes의 주요 구성 요소는 다음과 같습니다:
클러스터 : Kubernetes 클러스터는 하나 이상의 마스터 노드와 여러 워커 노드로 구성됩니다.
노드 : 클러스터 내의 각 서버를 노드라고 합니다. 마스터 노드는 클러스터를 관리하고, 워커 노드는 애플리케이션 컨테이너를 실행합니다.
파드(Pod) : 파드는 하나 이상의 컨테이너 그룹으로, 동일한 네트워크 네임스페이스를 공유합니다.
디플로이먼트(Deployment) : 디플로이먼트는 파드와 레플리카 세트를 관리하며, 애플리케이션의 선언적 업데이트를 처리합니다.
서비스(Service) : 서비스는 파드의 논리적 집합을 정의하고, 내부 또는 외부 네트워크에 접근할 수 있도록 합니다.
Kubernetes 클러스터를 설정하고 관리하는 방법은 다음과 같습니다:
Minikube는 로컬 Kubernetes 클러스터를 실행하는 도구입니다.
# Minikube 설치
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/
# Minikube 클러스터 시작
minikube start
# kubectl 설치
curl -LO "https://dl.k8s.io/release/$( curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# kubectl 클러스터 정보 확인
kubectl cluster-info
# kubectl 컨텍스트 설정
kubectl config use-context minikube
Kubernetes에서 애플리케이션을 배포하고 스케일링하는 방법은 다음과 같습니다:
다음은 간단한 Nginx 디플로이먼트를 정의한 YAML 파일입니다:
apiVersion : apps/v1
kind : Deployment
metadata :
name : nginx-deployment
spec :
replicas : 3
selector :
matchLabels :
app : nginx
template :
metadata :
labels :
app : nginx
spec :
containers :
- name : nginx
image : nginx:latest
ports :
- containerPort : 80
이 디플로이먼트를 적용하려면 다음 명령어를 사용합니다:
# 디플로이먼트 생성
kubectl apply -f nginx-deployment.yaml
# 디플로이먼트 상태 확인
kubectl get deployments
# 파드 상태 확인
kubectl get pods
디플로이먼트를 스케일링하려면 다음 명령어를 사용합니다:
# 디플로이먼트 스케일링
kubectl scale deployment nginx-deployment --replicas=5
# 스케일링 상태 확인
kubectl get deployments
Helm 은 Kubernetes 애플리케이션의 패키지 관리 도구로, 복잡한 애플리케이션을 정의하고 설치하는 데 사용됩니다.
Helm을 설치하려면 다음 명령어를 사용합니다:
# Helm 설치
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Helm 저장소 추가
helm repo add stable https://charts.helm.sh/stable
# 저장소 업데이트
helm repo update
Helm 차트를 사용하여 애플리케이션을 배포할 수 있습니다. 예를 들어, Nginx를 배포하려면 다음 명령어를 사용합니다:
# Nginx 배포
helm install my-nginx stable/nginx-ingress
# 배포 상태 확인
helm list
이로써 컨테이너화 및 오케스트레이션의 개념과 필요성, Docker와 Kubernetes를 이용한 애플리케이션 컨테이너화 및 오케스트레이션 방법에 대해 알아보았습니다.
이를 통해 애플리케이션의 이식성, 확장성, 관리 효율성을 높일 수 있습니다.