ASC

2. Container & Docker + CI/CD

호프 2023. 10. 29. 01:24

Container

컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지입니다.

 

컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해주며 컨테이너가 실제로 실행되는 환경에서 애플리케이션을 추상화할 수 있는 논리 패키징 메커니즘을 제공합니다.

Container의 특징

  • 컨테이너란 호스트 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것
  • 호스트 OS의 리소스를 논리적으로 분리시키고, 여러 개의 컨테이너가 공유하여 사용
  • 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동하는 것이 특징

 

컨테이너와 VM의 차이

 

컨테이너는 가상 머신(VM)과 마찬가지로 애플리케이션을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련해준다.

  • 컨테이너는 VM보다 훨씬 가볍다.
  • 컨테이너는 OS 수준에서 가상화되고 VM은 하드웨어 수준에서 가상화된다.
  • 컨테이너는 OS 커널을 공유하며 VM에 필요한 것보다 훨씬 적은 메모리를 사용한다.

 

Docker & Kubernetes

Docker

이미지를 기반으로 컨테이너를 생성하고 실행하여 애플리케이션과 필요한 환경을 패키징 -> 컨테이너화 기술을 제공한다.

 

Docker Image

애플리케이션과 그것을 실행하는 데 필요한 모든 것을 포장한 것으로, 도커 이미지를 사용해서 실제로 실행되는 인스턴스(컨테이너)를 만들 수 있다.

  • 애플리케이션을 실행하는 데 필요한 모든 "재료" (코드, 라이브러리, 설정 파일 등)가 들어있는 "레시피" 역할.
  • Docker 이미지를 만들기 위해서는 Dockerfile이 필요하다.

 

Docker Container

Docker Image를 바탕으로 실행되는 애플리케이션.

  • 레시피를 따라 만들어진 "요리"

 

Kubernetes

  • 컨테이너화 된 애플리케이션의 자동화된 배포, 확장 및 관리를 위한 오픈소스 플랫폼
  • 애플리케이션의 상태와 구성을 유지하고 컨테이너의 스케일링과 로드 밸런싱을 관리
  • 서비스 디스커버리, 자동 복구, 롤링 업데이트 등의 기능을 제공하여 애플리케이션의 운영을 효율적으로 관리

=> 컨테이너 오케스트레이션(Orchestration) 시스템으로 컨테이너화 된 애플리케이션을 효율적으로 실행, 관리

 

개발자는 도커를 사용하여 컨테이너 이미지를 생성 및 조작하고, Kubernetes를 사용하여 여러 마이크로서비스를 대규모로 관리합니다. 각 마이크로서비스는 여러 개의 컨테이너 자체로 개별 구성됩니다.

 

 

Kubernetes에서는 더 이상 Docker를 지원하지 않는다.

Docker Engine은 CRI 표준 인터페이스를 구현하지 않으므로 이를 위해 Kubernetes는 Dockershim 코드를 만들어 일시적인 해결책으로 사용해왔다. 하지만 이를 유지하는 것은 Kubernetes 를 유지보수하는 데 큰 부담이 되었고, Dockershim과 호환되지 않는 추가 기능들이 새로운 CRI 런타임에 구현되고 있으므로, Dockershim을 제거함으로써 해당 영역의 추가적인 개발이 가능하다.

https://kubernetes.io/blog/2022/02/17/dockershim-faq/

DevOps 와 CI/CD

DevOps

DevOps: Development + Operations

개발과 운용 간의 간극을 좁히기 위함

  • 어플리케이션과 서비스를 빠른 속도로 제공할 수 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합
  • DevOps 모델에서는 개발팀과 운영팀이 단일팀으로 병합되어 엔지니어가 개발에서 테스트, 배포, 운영에 이르기까지 전체 애플리케이션 수명 주기에 걸쳐 작업하고 단일 기능에 한정되지 않은 광범위한 기술을 개발한다.

 

CI/CD

CI (Continuous Integeration): 지속적 통합

  • 개발자들이 자신의 코드 변경 사항을 중앙의 저장소(ex. GitHub, GitLab)에 비번하게 병합하는 것
  • 개발 초기에 오류와 충돌을 미리 발견해 실행이 가능한 상태로 코드를 유지하기 위함
  • 코드를 저장소에 푸시할 때마다 자동 테스트가 실행되어 버그나 오류를 빠르게 감지하고 신속히 해결하여 소프트웨어 배포의 시간을 단축
  • ex. GitHub Actions

CD (Continuous Delivery/Development): 지속적 전달/배포

  • Continuous Delivery: 개발된 코드를 실제 프로덕션 환경에 배포하기 전까지의 과정을 자동화하는 것. 최종 배포는 수동으로 실행할 수 있다.
  • Continuous Development: 모든 과정을 자동화하며, 테스트가 통과되면 코드 변경사항이 자동으로 프로덕션 환경에 배포된다.
  • 코드 변경사항을 신속하게, 안정적으로, 그리고 지속적으로 고객에게 전달하기 위함
  • ex. Jenkins
CI/CD -> 소프트웨어의 배포 속도, 안정성을 높이기 위한 방법으로 배포 과정을 자동화해서 짧은 주기로 배포하는 DevOps의 핵심 프로세스

 

AWS CodeSeries

AWS CodeCommit

  • Git 호환 버전 시스템을 제공하는 서비스
  • 프라이빗 Git 저장소를 제공하며, 확장성과 높은 가용성을 제공
  • AWS의 보안 기능을 사용하여 코드 및 자산을 보호

AWS CodeBuild

  • 소스 코드를 컴파일하고, 테스트를 실행하며, 배포 가능한 아티팩트를 생성하는 데 사용되는 완전관리형 빌드 서비스
  • 서버 또는 빌드 인프라 관리 없이 코드 빌드 및 테스트를 수행
  • 컨테이너 기반 빌드를 지원하므로 사용자 정의 빌드 환경을 생성 가능

AWS CodeDeploy

  • 애플리케이션을 다양한 서비스(ex. EC2, Lambda, ECS 등)에 자동으로 배포
  • 다양한 배포 전략을 지원하며, 훅을 사용해 배포 라이프 사이클 중에 사용자 정의 스크립트나 작업을 실행

AWS CodePipeline

  • 지속적인 통합(CI) 및 지속적인 전달(CD) 파이프라인을 자동화하는 완전관리형 서비스
  • 여러 AWS 도구와 통합되어 워크플로우를 자동화 가능
  • CodePipeline은 코드 변경을 감지하고 이를 빌드, 테스트, 배포하는 전체 프로세스를 자동화

Reference

https://cloud.google.com/learn/what-are-containers?hl=ko

https://kubernetes.io/blog/2022/02/17/dockershim-faq/