[LG CNS AM Inspire Camp] 18. 클라우드 네이티브와 Docker
1. 클라우드 네이티브란?
최근 IT 업계에서는 클라우드 네이티브(Cloud Native)라는 개념이 대세로 자리 잡고 있다. CNCF(Cloud Native Computing Foundation)에서는 클라우드 네이티브 기술을 다음과 같이 정의하고 있다.
클라우드의 장점을 최대한 활용하여 정보 시스템을 구축 및 실행하는 환경
클라우드 네이티브 기술은 조직이 퍼블릭, 프라이빗, 그리고 하이브리드 클라우드와 같은 현대적이고 동적인 환경에서 확장 가능한 애플리케이션을 개발하고 실행할 수 있게 해준다. 컨테이너, 서비스 메쉬, 마이크로서비스, 불변(Immutable) 인프라, 그리고 선언형(Declarative) API가 이러한 접근 방식의 예시들이다.
이 기술은 회복성, 관리 편의성, 가시성을 갖춘 느슨하게 결합된 시스템을 가능하게 한다. 견고한 자동화 기능을 함께 사용하면, 엔지니어는 영향이 큰 변경을 최소한의 노력으로 자주, 예측 가능하게 수행할 수 있다.
Cloud Native Computiong Foundation은 벤더 중립적인 오픈 소스 프로젝트 생테계를 육성하고 유지함으로써 해당 패러다임 채택을 촉진한다. 우리 재단은 최신 기술 수준의 패턴을 대중화하여 이런 혁신을 누구나 접근 가능하도록 한다.
1-1. 클라우드 네이티브의 핵심 요소
a. 마이크로서비스(Microservice)
- 하나의 거대한 애플리케이션을 여러 개의 작은 서비스로 나눠 독립적으로 배포하고 운영하는 방식
- 각 서비스는 별도의 데이터베이스와 로직을 가질 수 있으며, API를 통해 통신함
b. 컨테이너(Container)
- 애플리케이션 실행 환경을 이미지 형태로 패키징하여 운영 체제에 독립적인 실행 환경 제공
- 대표적인 컨테이너 기술 : Docker, Kubernetes
c. 서비스 메쉬(Service Mesh)
- 마이크로서비스 간 네트워크 트래픽을 관리하는 기술
- 대표적인 서비스 메쉬 솔루션 : Istio, Linkerd
d. 불변 인프라(Immutable Infrastructure)
- 서버나 애플리케이션을 직접 수정하는 것이 아니라, 새로운 인스턴스를 배포하는 방식
- 기존 인프라는 수정하지 않고 폐기하는 구조로, 일관성과 안정성을 유지 가능
e. 선언형 API(Declarative API)
- k8s 같은 오케스트레이션 툴에서 사용되는 방식으로, 원하는 상태를 선언하면 시스템이 알아서 조정하는 형태
- kubectl apply -f deployment.yaml 같은 방식으로 애플리케이션을 배포
1-2. 구성요소
- Microservice (느슨한 결합): 독립적인 실행 및 배포가 가능한 마이크로서비스 아키텍처
- Container (오토스케일링): 경량화된 컨테이너 단위로 빠른 확장 가능
- DevOps (개발-운영 협업): 개발팀과 운영팀 간 원활한 협업 프로세스 구축
- CI/CD (배포 자동화): 소규모 개발팀도 자율적으로 독립적 서비스 운영 가능
또한, 클라우드 네이티브 설계 원칙을 따르는 데 중요한 두 가지 개념이 있다.
1-3. 개발방법론과 원칙
a. 애자일(Agile): 짧은 주기의 반복적 개발 방법론
소프트웨어 개발 프로젝트에서 가장 중요한 것은 변화에 빠르게 적응하고, 고객의 요구를 신속하게 반영하는 것이다. 이전 까지의 전통적인 개발 방식(워터폴, 폭포수 모델)은 처음부터 끝까지 모든 계획을 세운 뒤 진행하는 방식이었지만, 이 방식은 변경이 어렵고, 출시까지 시간이 오래 거린다는 단점이 있었다.
이러한 문제를 해결하기 위해 등장한 것이 바로 Agile 방법론이며, 이는 빠른 피드백, 반복적인 개발, 지속적인 개선을 중심으로 한 현대적인 개발 프로세스다.
애자일 개발을 처음 제안한 개발자들은 2001년, 미국 유타주에서 개발 선언문을 발표했으며 4가지 핵심 가치와 12가지 원칙이 담겨있다.
아래 사이트에서 확인이 가능하다.
https://agilemanifesto.org/iso/ko/manifesto.html
애자일 소프트웨어 개발 선언
애자일 소프트웨어 개발 선언 우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 작업을 통해 우리는 다음을 가치 있게
agilemanifesto.org
b. 12가지 요소(12 Factors): 클라우드 네이티브 설계를 위한 핵심 원칙 및 표준
클라우드 환경에서 애플리케이션을 안정적이고 확장 가능하게 운영하려면 기존의 모놀리식(monolithic) 방식이 아닌 클라우드 네이티브 아키텍처를 고려해야 한다.
이를 위해 12- Factor App 원칙이 널리 활용되며, 이는 SasS 애플리케이션을 개발할 때 고려해야 할 12가지 필수 요소를 정의한다.
12-Factor App 원칙은 Heroku의 창립자인 Adam Wiggins가 처음 제안하였으며, 현재 CNCF를 포함한 많은 클라우드 네이티브 환경에서 Best Practice로 자리 잡았다.
The Twelve-Factor App (한국어)
배경 이 문서에 기여한 사람들은 수백개 앱의 개발과 배포에 직접 참여했으며, Heroku 플랫폼을 통해서 방대한 앱의 개발, 운영, 확장을 간접적으로 관찰했다. 이 문서는 실제로 쓰이는 다양한 SaaS
12factor.net
2. Docker란?
Docker는 애플리케이션과 그 실행 환경을 컨테이너 이미지로 패키징하여 일관된 실행 환경을 제공하는 플랫폼이다. 개발자는 로컬에서 만든 이미지를 서버에 배포하여 동일한 환경에서 실행할 수 있다. 이는 환경 독립성을 보장하는 Docker의 가장 큰 장점이다.
2-1. Docker 기본 명령어
# 1. Docker 이미지 다운로드
$ docker pull ubuntu:latest
# 2. 컨테이너 실행
$ docker run -d -p 8080:80 nginx
# 3. 실행 중인 컨테이너 확인
$ docker ps
# 4. 컨테이너 중지
$ docker stop <컨테이너_ID>
# 5. 컨테이너 삭제
$ docker rm <컨테이너_ID>
# 6. 이미지 생성
$ docker build -t my-app .
# 7. Docker Hub에 이미지 업로드
$ docker login
$ docker tag my-app mydockerhub/my-app:latest
$ docker push mydockerhub/my-app:latest
2-2. Docker 예제
a. Dockerfile을 활용한 이미지 생성
컨테이너 이미지는 Dockerfile을 사용해 만들 수 있다.
# 베이스 이미지 설정
FROM python:3.9
# 작업 디렉토리 생성
WORKDIR /app
# 필요한 파일 복사
COPY . /app
# 패키지 설치
RUN pip install -r requirements.txt
# 실행 명령어 설정
CMD ["python", "app.py"]
위와 같은 Dockerfile을 사용하면 다음과 같이 이미지를 생성할 수 있다.
$ docker build -t my-python-app .
배포를 위해 Docker Hub에 이미지를 업로드 할 수도 있다.
$ docker login
$ docker tag my-python-app mydockerhub/my-python-app:latest
$ docker push mydockerhub/my-python-app:latest
이러면 다른 환경에서도 docker pull mydockerhub/my-python-app:latest로 동일한 이미지를 사용할 수 있다.
Docker 컨테이너 내부에서 작업해야 할 때 docker exec과 docker cp 명령어를 활용할 수도 있다.
# 실행 중인 컨테이너 내부로 접속
$ docker exec -it <컨테이너_ID> /bin/bash
# 컨테이너 내부의 특정 파일을 로컬로 복사
$ docker cp <컨테이너_ID>:/app/data.txt ./data.txt
# 로컬 파일을 컨테이너 내부로 복사
$ docker cp ./config.yaml <컨테이너_ID>:/app/config.yaml