[클라우드] 컨테이너

Letmegooutside·2022년 2월 3일
0

클라우드 컴퓨팅

목록 보기
3/6

컨테이너

개별 소프트웨어의 실행에 필요한 실행 환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행 환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체제 수준의 격리 기술

모듈화 되고 격리된 컴퓨팅 공간 또는 환경을 의미하며, 시스템 환경 의존성을 탈피하고 안정적으로 구동한다.

어플리케이션 실행에 필요한 라이브러리, 바이너리, 기타 구성 파일 등을 패키지로 묶어서 배포하면, 구동 환경이 바뀌어도 실행에 필요한 파일이 함께 따라다니기 때문에 오류를 최소화할 수 있다.

가상 머신 방식의 가상화보다 시스템에 대한 요구 사항이 적다. 또한 OS가 포함되지 않고 단순히 프로세스를 격리 시키기 때문에 가볍고 빠르게 동작하며 CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.

특징

  • 경량화 : 배포 시 게스트 OS가 포함 되지 않아 가볍다.

  • 효율성 : 호스트 OS 커널을 공유하므로, 자원을 미리 할당하지 않고 애플리케이션 동작에 필요
    한 컴퓨팅 자원만 필요로 한다.

  • 이식성 : 컨테이너가 작동하는 환경이라면 어디든지 작동시킬 수 있다.
    컨테이너는 Linux, Windows운영체제, 가상 머신, 베어 메탈, Local pc, Data Center,
    Public Cloud등 어느 환경에서나 구동 되므로 개발 및 배포가 크게 쉬워진다.

  • 유지 및 관리가 효율적 : 운영 체제 커널이 하나밖에 없기 때문에 운영 체제 수준에서 업데이트 또는 패치 작업을 한 번만 수행하면 변경 사항이 모든 컨테이너에 적용된다.

  • 낮은 안정성 : 호스트 OS 커널을 공유하는 구조로 장애 발생 시, 다른 컨테이너들이 영향을 받을 수 있다.

가상머신과 차이점

가상머신

  • 하이퍼바이저를 이용해 독립적인 GuestOS를 만들어낸다. 따라서 독립적인 플랫폼을 하나씩 증가시킬 때마다 불필요한 OS를 만드는 작업을 계속 해야 한다.

  • 확장성이 떨어지며 메모리나 자원에 관해 유동적으로 관리 하는 게 아니라 처음부터 정해 놓고 실행하기 때문에 비효율적이다.

컨테이너

  • 하나의 Host OS 위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행되며 불필요한 OS를 만드는 작업 및 인프라를 독립적으로 나눌 필요가 없어 확장성이 좋고 빠르다.

  • 가상화지만 Guest OS가 없고 Host OS의 커널은 공유하지만 독립된 환경 변수를 갖는다.

  • 컨테이너간 링크를 통해 조합을 할 수 있다.

  • Host OS위에 컨테이너 가상화를 시켜주는 여러가지 소프트웨어들이 있는데 현재는 Docker를 가장 많이 사용하고 있는 추세이다.

가상머신은 운영체제 위에 하드웨어를 에뮬레이션하고 그 위에 운영체제를 올리고 프로세스를 실행하는 반면에, 컨테이너는 하드웨어 에뮬레이션 없이 커널을 공유해서 바로 프로세스를 실행한다

이미지 (Image)

컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
상태 값을 가지지 않고 변하지 않는다. (Immutable)

  • ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있다. 좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로 ruby, go, database, redis, gitlab source, nginx등을 가지고 있다.

말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요 없이 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운 받고 컨테이너를 생성만 하면 된다.

Layer 저장 방식

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백 MB에 이른다.

처음 이미지를 다운 받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백 MB를 다시 다운 받는다면 매우 비효율적일 수 밖에 없다.

도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다.

이미지는 여러 개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정 되면 새로운 레이어가 생성된다.

  • ubuntu 이미지 : A + B + C
  • ubuntu 이미지를 베이스로 만든 nginx 이미지 : A + B + C + nginx
  • nginx 이미지를 기반으로 만든 webapp 이미지 : A + B + C + nginx + source 레이어

이 때 webapp 소스를 수정하면 A , B , C , nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운 받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기(read-write) 레이어를 추가한다.

이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다.

이미지 경로

이미지는 url 방식으로 관리하며 태그를 붙일 수 있다.

이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스
트나 롤백도 쉽게 할 수 있다

도커(Docker)

리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트

도커와 같은 컨테이너 가상화 솔루션은 OS에서 제공하는 자원 격리 기술을 통해 컨테이너라는 단위로 서비스를 분리할 수 있게 만들어준다.

도커는 Environment disparity 문제를 해결해준다.
이는 윈도우에서 개발한 프로그램이 서버가 리눅스일 때 코드가 동작하지 않는 상황 등을 말하는데 도커를 이용하면 다른 머신에서도 같은 환경을 구현할 수 있다.

  1. 윈도우와 서버에 도커를 설치하고 docker 파일을 생성한다.

  2. docker 파일에 구현하고 싶은 환경을 설정한다. (우분투, 파이썬, 깃 등)

  3. 이 파일을 서버와 컴퓨터에게 주면 docker는 그 파일을 읽고 필요한 환경을 다운받는다.

  4. docker는 설정한 환경과 같은 가상 컨테이너를 컴퓨터에 생성한다.

    컴퓨터에서 서버로 docker 파일과 함께 코드를 업로드 하면 잘 작동할 수 있게 된다.

쿠버네티스(Kubernetes)

컨테이너화된 워크로드와 서비스를 관리하기 위한 이식할 수 있고 확장 가능한 오픈소스 플랫폼으로 컨테이너 오케스트레이션 툴이다.

오케스트레이션 : 컨테이너를 스케줄링, 클러스터링, 서비스 디스커버리, 로깅 및 모니터링 하는 것




Reference
https://velog.io/@geunwoobaek/컨테이너-및-도커-개념정리
https://www.44bits.io/ko/post/is-docker-container-a-virtual-machine-or-a-process
https://velog.io/@ckstn0777/도커란-무엇인가
https://www.youtube.com/watch?v=chnCcGCTyBg
https://dev-youngjun.tistory.com/14
[Column] 클라우드 네이티브란? – CLOUDMATE (cloudmt.co.kr)
https://conservative-vector.tistory.com/entry/쿠버네티스와-도커의-차이

0개의 댓글