상권's

TIL 52 (Docker, Docker-compose, AWS ECS)(2021.12.03) 본문

~2022 작성 글/TIL

TIL 52 (Docker, Docker-compose, AWS ECS)(2021.12.03)

라마치 2021. 12. 3. 20:46

Docker란? 출처

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.

 

키워드

1. 이미지

실행되는 모든 컨테이너는 이미지로부터 생성됩니다. 이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있습니다. 이미지를 이용해 여러 개의 컨테이너를 생성할 수 있습니다. 이를 이용해 앞서 설명한 애플리케이션의 수평 확장이 가능합니다.

이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼) 변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있습니다. 예를 들어 node.js로 작성된 애플리케이션을 이미지로 만들고 싶은 경우, nodejs 이미지를 기본 이미지로 삼고 내가 만든 애플리케이션을 추가해 넣고, 이미지화할 수 있습니다.

 

  • 레지스트리(Registry)
    • 도커 이미지를 관리하는 공간입니다.
    • 특별히 다른 것을 지정하지 않는다면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정합니다.
    • 레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나뉠 수 있습니다.
  • 레포지토리(Repository)
    • 레지스트리 내에 도커 이미지가 저장되는 공간입니다.
    • 이미지 이름이 사용되기도 합니다.
    • GitHub의 레포지토리와 유사하게 생각하시면 됩니다.
  • 태그(Tag)
    • 같은 이미지라고 할지라도 버전 별로 안의 내용이 조금은 다를 수 있습니다.
    • 해당 이미지를 설명하는 버전 정보를 주로 입력합니다.
    • 특별히 다른 것을 지정하지 않는다면 latest 태그를 붙인 이미지를 가져옵니다.

 

레지스트리

이미지는 레지스트리에 저장됩니다. 대표적인 이미지 레지스트리로는 Docker Hub, Amazon ECR이 있습니다. 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드 받게 됩니다.

 

컨테이너 방식의 장점

1. 의존성 충돌 문제를 해결해 준다.

컨테이너 기술은 애플리케이션을 컨테이너 내에 구성합니다. 즉, 컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있다는 이야기입니다.

이는 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에 가능한 것입니다.

 

컨테이너는 무엇을 격리하고, 어떤 자원들을 독립적으로 소유할까요? 다음 세 가지를 기억하세요.

프로세스

  • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스할 수 있습니다.
  • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없습니다

네트워크

  • 기본으로 컨테이너 하나에 하나의 IP 주소가 할당되어 있습니다.

파일 시스템

  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있습니다. 그래서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.

 

2. 개발과 배포 환경을 일치시킨다

  • OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있습니다.
  • 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있습니다.

3.수평 확장을 쉽게 해준다

4.각 서버에 새로운 내용을 배포하기 쉽게 만들어준다

서비스 제공자들은 트래픽 분산을 위해 프록시 서버를 운영하며, 프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 돕습니다. (이러한 서버를 리버스 프록시의 한 종류인 '로드 밸런서'라고 부릅니다)

[이미지] 리버스 프록시 구조 예시

 

컨테이너 기술의 가장 큰 장점은 실행 환경의 일치입니다. 더 많은 트래픽으로 인한 서버 증설에 컨테이너 기술은 아주 활발하게 이용되고 있습니다. 동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸런서에 이 서버를 추가하기만 하면 됩니다. (심지어 AWS는 서버를 만들고 삭제하는 일을 자동으로 해줍니다!)

 

이러한 기술을 응용하여, 새로운 버전의 애플리케이션을 여러 서버 중 몇 대에만 운영하여 테스트하는 방법도 가능합니다. 이를 통해 새 버전의 애플리케이션에서 발생할 수 있는 문제들을 미리 확인하고, 이러한 문제가 사용자 전체에게 영향을 끼치지 않도록 만들 수도 있습니다. 쿠버네티스와 같이 "오케스트레이션 도구"라고 부르는 것들이 이러한 일을 해주는 도구입니다. 이는 결국 컨테이너 기술 덕분에 가능한 것입니다.


읽어볼 자료

 

Docker-compose 출처

Docker compose는 다중 컨테이너 응용 프로그램을 정의하고 공유하기 위해 개발된 도구입니다.

Compose를 사용하면 YAML 파일을 생성하여 서비스를 정의하고 명령 하나로 모든 것을 회전시키거나 해체할 수 있습니다.

Compose를 사용하면 응용 프로그램 스택을 파일로 정의하고, 프로젝트 repo의 루트에 보관하며, 다른 사용자가 프로젝트에 쉽게 참여할 수 있다는 것이 큰 장점입니다.

 

누군가가 당신의 repo를 복제하고 compute 앱을 시작하면 됩니다. 사실, 여러분은 GitHub/GitLab에서 지금 정확히 이런 일을 하고 있는 많은 프로젝트들을 볼 수 있을 것입니다.


Amazon ECS란?

Amazon ECS는 컨테이너화된 애플리케이션의 손쉬운 배포, 관리 및 크기 조정을 지원하는 완전관리형 컨테이너 오케스트레이션 서비스입니다.

Amazon ECS는 클러스터에서 컨테이너를 손쉽게 실행, 중지 및 관리할 수 있게 하는 컨테이너 관리 서비스로서 확장성과 속도가 뛰어납니다. 컨테이너는 서비스 내에서 개별 태스크나 여러 태스크를 실행하는 데 사용하는 태스크 정의에 정의됩니다. 이 컨텍스트에서 서비스는 클러스터에서 지정된 수의 태스크를 동시에 실행하고 유지할 수 있는 구성입니다. AWS Fargate에서 관리하는 서버를 사용하지 않는 인프라에서 작업 및 서비스를 실행할 수 있습니다. 또는 인프라에 대한 더 세부적인 제어를 위해 관리하는 Amazon EC2 인스턴스의 클러스터에서 태스크와 서비스를 실행할 수 있습니다.

 

Amazon ECS의 기능

Amazon ECS는 특정 리전 내의 여러 가용 영역에 걸쳐 고가용성 방식으로 컨테이너를 실행하는 과정을 간소화하는 리전 서비스입니다. 새 또는 기존의 VPC에서 Amazon ECS 클러스터를 생성할 수 있습니다.

 

Docker에 대해서 학습을 하고 추가적으로 이론에 대해서만 알아봤습니다. 다음에 배포를 할 때에 사용하게 된다면 자세하게 학습해서 블로그에 올려보도록 하겠습니다.

'~2022 작성 글 > TIL' 카테고리의 다른 글

TIL 54 (복습)  (0) 2022.02.04
TIL 53 (배포 자동화)(2021.12.06)  (0) 2021.12.06
TIL 51 (HTTP/1,2,3, git branch)(2021.12.02)  (0) 2021.12.02
TIL50 (aws)(2021.12.01)  (0) 2021.12.01
TIL 49 (git branch, 개인프로젝트2) (2021.11.30)  (0) 2021.11.30
Comments