🌱
오늘 전문가 리뷰가 있어서 한 회사에서 머신러닝 팀에서 일하고 계신 전문가와 이야기를 할 시간이 있었다.
이야기를 하면서 백엔드에서 필수적으로 해봐야 할 것이 "컨테이너 기반의 배포"라는 얘기를 해주셨다.
여기서 컨테이너 기반의 배포가 무슨 의미인지 알고싶다는 생각이 들었다!
컨테이너 기반 배포란?
컨테이너 기반 배포는 애플리케이션과 그 종속성을 "컨테이너"라는 격리된 환경에 패키징하여 배포하는 방식이다. 여기서 컨테이너는 애플리케이션을 실행하는데 필요한 모든 환경을 포함한다.
주요 컨테이너 기술들
- Docker: 가장 널리 사용되는 컨테이너 플랫폼
- Podman: 데몬 없이 동작하는 보안 중심 컨테이너 도구
- containerd: 클라우드 네이티브 컴퓨팅 재단(CNCF)의 컨테이너 런타임
컨테이너 배포의 장점
- 일관성
"내 컴퓨터에서는 작동했는데..." 문제 해결
- 격리성
각 애플리케이션이 독립적으로 실행되어 충돌 방지
- 이식성
개발, 테스트, 운영 환경 간 동일한 실행 환경 보장
- 효율성
가상머신보다 가볍고 빠르게 실행
- 확장성
쉽게 확장하고 오케스트레이션 도구와 연동 가능
기본 워크플로우
- 코드 작성 및 애플리케이션 개발
- 개발자가 애플리케이션 코드를 작성
- 로컬 환경에서 테스트
- Dockerfile 작성
- 애플리케이션 실행에 필요한 환경을 코드로 정의
- 기본 이미지, 필요한 패키지, 종속성, 설정, 파일 복사, 실행 명령어 등을 명시
- 컨테이너 이미지 빌드
- Dockerfile을 기반으로 애플리케이션과 환경이 패키징된 이미지를 생성
- 이 이미지는 불변(immutable)이며, 애플리케이션의 스냅샷이라고 생각하면 됨
- 이미지 저장소에 업로드
- 빌드된 이미지를 Docker Hub, AWS ECR, Google GCR 같은 이미지 레지스트리에 업로드
5.배포 환경에서 컨테이너 실행
- 저장소에서 이미지를 가져와서 실행 환경에서 컨테이너로 실행
- 모니터링 및 관리
- 실행 중인 컨테이너의 상태를 모니터링
- 필요에 따라서 스케일 업/다운, 업데이트, 롤백 등을 수행
- 업데이트 및 새 버전 배포
- 코드 수정 시 새 이미지를 빌드하고 태그를 변경
- 새 이미지를 레지스트리에 업로드
- 배포 환경에서 새 버전의 컨테이너로 교체(무중단 배포 가능)
지속적 통합/배포(CI/CD)와의 연계
- Jenkins, GitHub Actions, GitLab CI 등과의 통합
- 자동화된 빌드-테스트-배포 파이프라인 구성
컨테이너 배포 과정 흐름도
