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
'ASC' 카테고리의 다른 글
6. Storage - S3 & CloudFront (0) | 2023.11.23 |
---|---|
5. RDS & DynamoDB (1) | 2023.11.16 |
Computing - Lightsail & EC2, Auto Scaling & ELB (0) | 2023.11.08 |
3. VPC & Route53 (0) | 2023.11.01 |
1. 클라우드 컴퓨팅 개요 & IAM (0) | 2023.09.29 |