웹 개발 파이프라인
코드 개발 => 빌드=> 테스트 => 코드 병합(지속적 통합) => 코드 리포지토리에 자동으로 릴리스(지속적 인도) => 프로덕션 환경에 자동으로 배포(지속적 배포)
전통적 인도 프로세스의 한계점
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 |