본문 바로가기

데브코스

웹 개발 파이프라인 구축

웹 개발 파이프라인

코드 개발 => 빌드=> 테스트 => 코드 병합(지속적 통합) => 코드 리포지토리에 자동으로 릴리스(지속적 인도) => 프로덕션 환경에 자동으로 배포(지속적 배포)

 

전통적 인도 프로세스의 한계점

1. 느린 인도 기간

: 개발 요구사항이 정의된 때로부터 제품 전달이 완료되기까지 긴 시간 소요

 

2. 느린 피드백 주기

: 개발팀의 효율성 향상에 걸림돌로 작용

 

3. 자동화 미비

: 릴리스 회수가 적으므로 자동화 필요 감소 => 릴르스 기간 예측 어려워짐

 

4. 핫픽스 위험성

: 긴급한 코드 변경에 대하여 충분한 테스트가 이루어질 수 없는 위험

 

5. 개발 문화 건전성 제한

: 팀 스트레스, 의사소통 부족, 책임의 분산, 낮은 업무 만족도, ... 

 

➡️ 해결책: 프로세스의 각 단계를 자동화

  • 빠른 제품 인도
  • 짧은 피드백 주기
  • 위험도가 낮은 릴리스: 반복과 롤백
  • 유연한 릴리스 정책 결정 가능

 

자동 배포 파이프라인

 

코드 변경 => 지속적 통합 => 자동 인수 테스트 => 구성 관리

 

지속적 통합

: 코드가 올바르게 빌드 및 통합되는지를 자동으로 확인

 

  • 리포지토리에서 코드를 체크아웃
  • 빌드(컴파일 및 링크) 를 수행하고 단위 테스트를 행함

      : 테스트 커버리지 리포트 생성

  • 코드 품질을 검증

      : 정적 분석을 통한 규칙 검사

      : 코딩 규약 등의 준수 여부 검사

 

인수 테스트(User Acceptance Test)

  • 제품이 릴리스할 준비가 되었는지를 "사용자 요구사항에 견주어" 확인
  • 전통적으로 QA 팀의 역할
  • 통합 테스트, 인수 테스트, 비기능적 분석(성능, 확장성, 보안, ... ) 등을 포함

CD 파이프라인에 통합

  • 프로덕션 환경의 응용을 자동으로 구성하고 배포
  • 구성 관리 도구를 이용하여 구성 관리 파일을 버전 관리 시스템에 저장하고 변경 이력 추적 

 

파이프라인 자동화 도구들

 

  • 컨테이너 가상화 및 클러스터 운용: Docker + Kubernetes
  • 소프트웨어 개발 파이프라인 자동화 서버: Jenkins
  • 구성 관리 자동화: Ansible
  • 소프트웨어 버전 관리: Github
  • 그 외: 빌드 도구(자동화 지원), 단위 테스트 프레임워크, 정적 코드 분석기, 인수 테스트 프레임워크, ...

 

컨테이너화(Containerization)

 

: 응용 프로그램, 설정 파일, 라이브러리, 그리고 이들 사이의 의존성 관계를 한 군데에 묶어(컨테이너 안에 넣어) 관리

  • 소프트웨어 개발 및 배포의 효율과 안정성을 향상시킴
  • 하이퍼바이저에 의한 가상 기계의 대체 및 보완 방식으로 각광받고 있음
  • 시스템 의존성이 최소화되어 소프트웨어 시스템의 이식이 용이해짐
  • 예측 가능하고 유연한 소프트웨어 실행 환경을 제공하여 클라우드 컴퓨팅 인프라에서 활용도가 높음 

 

컨테이너 가상화와 도커

 

가상화(Virtualization)

 

: 컴퓨팅 자원의 추상화를 일컫는 광범위한 용어

: 물리적인 컴퓨팅 자원의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 자원과 상호 작용하는 방식으로부터 감추는 기술

: 컴퓨터 안에 또 다른, 즉 가상의 컴퓨터가 존재하도록 하는 기술

 

 

가상화 컴퓨팅의 이점

 

시스템 측면

  • 시스템 이용률 향상
  • 설정의 구성과 복원이 용이

 

비즈니스 측면

  • 자본 및 운영 비용 절감
  • 다운타임 최소화
  • 비즈니스 연속성 및 재해 복구 향상
  • 데이터 센터 관리 간소화 

 

우리의 관심

  • 개발한 소프트웨어의 배포,테스트, 구성 관리 등에 (실제 물리적 하드웨어에 상관 없이) 통일된 환경을 제공할 수 있음
  • 따라서 소프트웨어 통합 / 인도 프로세스의 자동화에 적용하기 좋음 

 

서버 가상화 기술의 진화

 

1. 가상 기계 기반

: 하이퍼바이저를 이용

: Type 1 => 네이티브 또는 베어메탈 형

: Type 2 => 호스트형

 

2. 컨테이너 기반

: 호스트 OS 의 컨테이너 기술을 응용

 

* 호스트: 다른 시스템을 가상화하여 실행하는 컴퓨터

* 게스트: 호스트 시스템 위에 가상화되어 제공되는 (가상) 시스템

 

 

컨테이너 사용의 이점

  • 가상 기계의 대체 또는 보완 방식으로 각광받고 있음
  • 소프트웨어 개발 및 배포의 효율과 안정성을 향상시킴

       : 응용 프로그램, 설정 파일, 라이브러리, 그리고 이들 사이의 의존성 관계를 한 데 묶어 관리

       : 이 "묶음" 을 컨테이너 라고 부르고, 컨테이너 엔진의 도움으로 시스템 의존성이 최소화되어 소프트웨어 시스템의 이식이 

         용이해짐

  • 일관성 있는 런타임 환경, 애플리케이션 샌드박스화, 디스크 용량 절감, 낮은 오버헤드 

 

도커 (Docker)

 

: 널리 이용되고 있는 컨테이너 기반 가상화 플랫폼

: Linux, Windows, MacOS 상에서 실행되는 컨테이너 엔진을 제공

: AWS, GCP, Azure 등의 클라우드 컴퓨팅 인프라와 결합하면 더욱 유연한 운영이 가능 

 

도커의 구성 요소

도커 이미지

  • 응용을 실행하는 데 필요한 모든 파일들과 그것을 실행하는 방법을 한 데 묶어놓은 것
  • 상태를 저장하지 않는(stateless) 방식 : 네트워크로 전송, 레지스트리에 저장, 이름 및 버전 지정 가능
  • 계층화되어 있다는 특징을 갖고 있으며, 어떤 이미지로부터 다른 이미지를 만드는 것이 가능

 

도커 컨테이너

  • 이미지의 실행 인스턴스
  • 하나의 이미지로부터 여러 컨테이너를 만들어 동일한 응용을 여러 개 실행할 수 있음(각각은 독립)
  • 상태를 저장하는(stateful) 방식 : 컨테이너를 사용하면서 상태를 변경할 수 있음

       ➡️ 그러나 컨테이너가 소멸하면 이 상태도 잊어버림

 

컨테이너와 이미지 관련 명령어 요약

 

docker run <이미지 이름>

: 이름이 주어진 이미지를 로컬에서 또는 레지스트리에서 가져다가 컨테이너를 만들어 실행

 

docker ps, docker ps -a 

: 현재 실행 중인 (또는 중단되어 있는 것까지 포함하여) 컨테이너들의 정보를 조회

 

docker images

: 로컬 컴퓨터에 가지고 있는 이미지들의 정보를 조회

 

docker stop <컨테이너 이름 / ID>

: 현재 실행 중인 컨테이너의 실행을 중단

: 컨테이너가 없어지지는 않음

 

docker rm < 컨테이너 이름/ ID >

: 컨테이너를 삭제

 

docker rmi < 이미지 이름/ ID >

: 이미지를 삭제

 


도커 이미지 생성

 

🌟 배운 점

오늘은 도커에 대해서 배웠다. 백엔드 강의를 들으면서 도커를 사용했지만, 무슨 역할을 하는건지 이해가 가지 않았는데 강의를 들으면서 도커가 어떤 역할을 하는지, 완벽하게 이해는 하지 못했지만 어느 정도 감이 잡힌 것 같다. 하지만 도커의 이미지를 생성하고 컨테이너가 각각 어떤 역할을 하는지 아직 잘 모르겠다. 이해하는 시간이 필요할 것 같다. 

'데브코스' 카테고리의 다른 글

젠킨스(Jenkins)  (0) 2024.12.06
쿠버네티스(Kubernetes)  (4) 2024.12.03
오픈 소스 컨트리뷰트, 저작자 되기  (2) 2024.12.01
오픈 소스 프로젝트  (0) 2024.11.30
컨트리뷰션(Contribution)  (0) 2024.11.28