이 글은 [2024 NEW] 개발자를 위한 쉬운 도커 강의를 듣고 작성한 글입니다! 모든 강의자료 이미지 출처는 해당 강사님께 있습니다.
클라우드
클라우드는 보통 스토리지 저장소를 말한다. 클라우드 서비스를 사용하면 원하는 파일을 클라우드에 저장할 수 있다. 사용한 만큼만 비용을 지불한다. 업로드한 파일들은 실제로 어디에 저장될까? 각각의 클라우드 업체들은 자체적으로 서버를 가지고 있고, 여기에 모든 사용자의 파일이 물리적으로 섞여있는 상태로 저장된다. 클라우드 서비스를 사용한다는 것은 인프라적인 부분에 신경쓰지 않고 실제 서비스의 기능만 사용하겠다는 것을 의미한다. 클라우드를 사용하면 물리적인 디바이스에서 자유로워지고 필요할 때 마다 빠르게 확장할 수 있는 편리함이 있다. 클라우드 컴퓨팅은 단순히 스토리지에 국한되지 않고 서버 컴퓨터로 개념이 확장된다.
클라우드를 한 마디로 정의하자면 다른 회사의 서버를 빌려서 운영하는 것이다. 다른 회사는 대표적으로 마이크로소프트의 Azure, 아마존의 AWS, 구글의 GCP가 있다. 누구나 사용할 수 있는 서비스를 Public cloud라고 한다. 계열사가 제공하는 서비스는 같은 조직 내에 속해있는 회사에만 서버를 만들어서 제공한다. 이것을 Private cloud라고 한다.
클라우드의 특징은 사용 요청 즉시 서버를 생성한다는 것이다. 서버를 생성한다는 것을 Provisioning이라고 한다. 또한, 실제 사용한 시간 만큼만 비용을 지불하면 된다.
클라우드를 사용하는 핵심적인 이유는, 현대 애플리케이션이 겪는 다양한 문제들을 클라우드를 통해 해결할 수 있기 때문이다.
1. 트래픽이 증가할 때 빠르게 대처할 수 있는가? (확장성, Scalability)
현대 애플리케이션에서는 사용자의 수요의 변동이 크다. 온라인 커머스 같은 경우, 특정 할인 기간에 사용자의 요청이 급증하고, 회계 시스템 같은 경우에는 특정 기간이 아닌 경우에는 트래픽이 거의 없을 수도 있다. 트래픽이 증가하면 서버를 늘려야 하고, 트래픽이 없으면 서버를 감소시켜야 한다. 클라우드를 사용하면 트래픽 증가에 빠르게 대처할 수 있다. 이 특징을 확장성이라고 한다.
2. 장애 발생 시 빠르게 복구할 수 있는가? (복원력, Resilience)
클라우드 서비스가 복원력이 뛰어나다고 하는 이유는 전 세계에 다수의 데이터 센터를 가지고 있기 때문이다. 복구에 사용하는 서버를 Disaster Recovery 라고 한다.
3. 운영 비용을 효율적으로 운영할 수 있는가?
비효율적으로 사용해서 비용이 비싸게 청구하는 경우도 많다. 전문 아키텍트가 서버 가용량을 적절하게 구성해야 하고, 비용 최적화를 지속적으로 수행해야 한다.
클라우드 네이티브
핵심은 클라우드가 아니라 애플리케이션에 있다. 애플리케이션이 클라우드에 적합하지 않으면 클라우드를 사용하는 것은 크게 의미가 없다. 클라우드 네이티브 애플리케이션은 클라우드 환경을 더 잘 활용할 수 있는 애플리케이션 구조이다. 어떤 애플리케이션을 클라우드 네이티브 애플리케이션이라고 부를까?
1. MSA
MSA는 애플리케이션을 여러 단위로 분리하여 트래픽 증가에 효율적으로 대처하기 위한 소프트웨어 아키텍처이다.
예전에는 모든 기능을 하나의 애플리케이션에 구성했는데, 이런 전통적인 방식을 모놀리식 방식이라고 한다. 하나의 애플리케이션의 크기가 커지기 때문에 애플리케이션을 실행하는데 시간이 오래 걸린다. 트래픽이 증가할 때는 트래픽을 받을 수 있는 서버를 증가시켜야 하는데, 서버 실행시간이 길어지면 트래픽에 대처할 수 있는 능력도 떨어지게 된다. 하나의 애플리케이션의 크기가 클수록 개발에 소요되는 빌드 시간이나 배포 시간이 오래 걸린다.
MSA는 도메인이나 기능별로 여러개의 모듈로 분리해서 서버를 배포한다. 서버들은 각각 트래픽을 수용한다. 주문 트래픽이 늘어날 경우, 주문 기능을 가진 모듈만 증가시키면 된다. 각각의 모듈의 크기가 작기 때문에 서버를 스케일 아웃 하는 시간이 빨라진다. 서버를 스케일 아웃 한다는 것은, 서버의 대수를 늘려서 트래픽에 대처한다는 것을 의미한다. 스케일 인은 서버의 개수를 줄인다는 것을 의미한다. 모듈 별로 완전히 독립되어 있어서 각각의 모듈이 각각 다른 언어를 써서 개발이 가능하다는 장점이 있다. 하나의 기능 에러로 인해 모든 서비스에 영향을 끼치는 문제를 방지할 수 있다.
2. 컨테이너 (Container)
컨테이너의 이미지에는 소프트웨어가 실행하기 위한 환경들이 모두 포함되어 있다. 이미지를 가지고 있으면 어떤 환경에서든 동일한 실행 동작을 보장할 수 있다. 컨테이너를 사용하지 않으면 각각의 서버에 프로그램을 별도로 운영해야 하고, 환경의 불일치 문제가 발생할 수 있다.
3. 상태비저장 (Stateless)
애플리케이션은 상태를 가지지 않아야 하고, 상태를 가질 경우 외부에 이 상태가 분리되어 있어야 한다. 상태를 가진다는 것은 각각의 서버가 다르게 동작할 수 있다는 것을 의미한다.
4. Devops 및 CI/CD
배포를 자동화 하고 변경사항을 빠르게 반영할 수 있어야 한다.
'Docker' 카테고리의 다른 글
PostgresSQL 컨테이너 구성 (0) | 2024.03.01 |
---|---|
Leafy 애플리케이션 구성 (0) | 2024.02.29 |
멀티 스테이지 빌드 (0) | 2024.02.27 |
Dockerfile 지시어 (1) | 2024.02.27 |
빌드 컨텍스트 (0) | 2024.02.20 |