구글 클라우드 컨테이너와 컨테이너 이미지 | Container and Container Image
🐳 구글 클라우드 플랫폼에서의 컨테이너(Container)와 이미지(Image)에 대한 개념을 정리합니다.
구글 클라우드 컨테이너와 컨테이너 이미지 | Container and Container Image
KEYWORDS
컨테이너, 컨테이너 이미지, 구글 클라우드 컨테이너, 도커 컨테이너, 구글 클라우드 도커, Container, Container Image
Containers
- Dedicated Server (애플리케이션 코드, 종속 항목, 커널, 하드웨어)
➔ Virtual Machine (애플리케이션 코드, 종속 항목, 커널, 하드웨어 + 하이퍼바이저)- 애플리케이션을 실제 컴퓨터에 배포합니다.
➔ 리소스 낭비가 크고 대규모 배포와 유지보수에 많은 시간이 소요되어 가상화가 필요합니다. - 하이퍼바이저는 가상 머신을 생성하고 관리합니다.
- 애플리케이션을 실제 컴퓨터에 배포합니다.
- Running Multiple Apps on a Single VM
➔ 종속 항목을 공유하는 애플리케이션들이 서로 격리되지 않는 문제 발생합니다.
The VM-Centric Way to Solve This Problem
- 애플리케이션마다 전용 가상 머신을 실행합니다.
- 각 애플리케이션에서 고유한 종속 항목을 유지 관리합니다.
➔ 커널이 격리되어 있어 애플리케이션들 간에 성능에 영향을 주지 않습니다. - 하지만 대규모 시스템의 경우 전용 VM은 중복적이며 낭비가 발생하고, VM 시작 속도가 느립니다.
- 각 애플리케이션에서 고유한 종속 항목을 유지 관리합니다.
User Space Abstraction and Containers
- 종속 항목 문제 해결 ㅣ 애플리케이션과 종속 항목 수준에서 추상화를 구현합니다.
- 전체 머신이 아니라 사용자 공간만 가상화합니다.
- 사용자 공간 ㅣ 커널 위에 있는 모든 코드로, 애플리케이션과 종속 항목을 포함합니다.
- 운영체제 전체를 실행하지 않아 가벼우며, 빠르게 만들고 종료할 수 있습니다.
- 기본 시스템 위에서 예약하고 패키징하기 때문에 효율적입니다.
➔ 컨테이너를 만듭니다.
- Container (애플리케이션 코드, 종속 항목) ㅣ 단일 애플리케이션 코드를 생성하는 격리된 사용자 공간입니다.
Why Developers Like Containers
- 애플리케이션 중심으로 확장성이 높고 고성능 애플리케이션을 제공하며, 기본 하드웨어와 소프트웨어를 전제로 작업할 수 있습니다.
- 애플리케이션을 쉽게 빌드할 수 있습니다.
➔ 느슨하게 결합되고 세분화된 구성 요소를 사용한 모듈식 설계입니다. - 애플리케이션의 종속 항목을 서로 격리할 방법이 필요합니다.
- 가상 머신에서 애플리케이션을 패키징하는 것은 낭비입니다.
- 개발자의 노트북에서는 잘 작동하지만 프로덕션 환경에서는 실패하는 애플리케이션의 문제를 해결할 수 있습니다.
Container Image
- Image ㅣ 애플리케이션과 종속 항목
➔ Container ㅣ 실행 중인 이미지 인스턴스 ➔ 소프트웨어를 컨테이너 이미지로 빌드하면 개발자는 애플리케이션을 손쉽게 패키징하고 제공할 수 있습니다. ➔ 소프트웨어가 필요합니다 (Docker).
Containers Use a Varied Set of Linux Technologies
- Processes ㅣ 리눅스 프로세스마다 서로 분리된 고유 가상 메모리 주소 공간이 존재하며, 빠르게 생성하고 삭제할 수 있습니다.
- Linux Namespaces ㅣ 프로세스 ID 번호, 디렉토리 트리, IP 주소를 제어합니다. (≠ Kubernetes namespaces)
- cgroups ㅣ 애플리케이션이 사용 가능한 CPU 시간, 메모리, I/O 대역폭, 기타 리소스의 최대 사용량을 제어합니다.
- Union File Systems ㅣ 애플리케이션과 종속 항목을 간결한 최소 레이어 모음으로 캡슐화합니다.
Containers Are Structured in Layers
- 컨테이너 매니페스트 파일로 이미지를 빌드합니다.
- Docker 형식의 컨테이너 이미지 ➔ Dockerfile (컨테이너 이미지 내부 레이어가 지정됨)
FROM ubuntu:18.04
ㅣ FROM 문으로 기본 레이어를 공개 저장소에서 가져와 생성합니다.COPY ./app
ㅣ COPY 명령어로 빌드 도구의 현재 디렉토리에서 복사된 파일이 포함된 레이어를 추가합니다.RUN make /app
ㅣ RUN 명령어는 make 명령어를 사용하여 애플리케이션을 빌드하고, 빌드 결과를 세 번째 레이어에 배치합니다.CMD python /app/app.py
ㅣ 마지막 레이어는 실행 시 컨테이너 내에 실행할 명령어를 지정합니다.
- 요즘은 배포 및 실행하는 컨테이너에 애플리케이션을 빌드하는 것을 권장하지 않습니다.
➔ 애플리케이션 패키징에 다단계 빌드 프로세스를 사용합니다. - 이미지에서 새 컨테이너를 만들면, 컨테이너 런타임에서는 쓰기 가능한 레이어를 기본 레이어 위에 추가합니다 (컨테이너 레이어).
Containers Promote Smaller Shared Images
- 여러 컨테이너가 동일한 기본 이미지에 접근 권한을 공유하면서 자체 데이터 상태를 보유합니다.
- 컨테이너를 실행하면 컨테이너 런타임에서 필요한 레이어를 가져옵니다.
➔ 업데이트 시 차이 나는 항목만 복사합니다.
How Can You Get Containers?
- 컨테이너화된 소프트웨어를 컨테이너 레지스트리에서 다운로드합니다.
- ex. gcr.io
- 공개 오픈소스 이미지가 다수 포함되어 있으며, 구글 클라우드 고객은 이를 사용하여 비공개 이미지를 클라우드 IAM과 잘 통합되는 방식으로 저장할 수 있습니다.
- Docker ㅣ 오픈소스 Docker 명령어를 사용하여 자신만의 컨테이너를 빌드합니다.
- 반드시 신뢰할 수 있는 컴퓨터에서 빌드해야 합니다.
- Build Your Own Container Using Cloud Build
- 빌드에 필요한 소스 코드를 다양한 스토리지 위치에서 검색할 수 있습니다 (Cloud Storage, Git repo, Cloud Source Repo).
- 빌드 단계를 구성하여 종속 항목을 가져오고 ➔ 소스 코드를 컴파일하고 ➔ 통합 테스트 (Docker 컨테이너에서 실행).
- 빌드한 이미지를 다양한 실행 환경에 제공할 수 있습니다 (GKE, App Engine, Cloud Functions).
Reference
This post is licensed under CC BY 4.0 by the author.