Search
Duplicate

컨테이너와 리눅스의 관계

키워드
컨테이너
리눅스
커널
하이퍼바이저
가상화

알고싶은점

컨테이너를 알기 위해 리눅스를 알아야하는 이유

컨테이너

컨테이너 자체가 리눅스 컨테이너를 이용하는 것
리눅스 컨테이너는 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술

운영체제 수준의 가상화 기술의 의미

1. 하이퍼바이저 가상화

하이퍼바이저 : 가상머신과 하드웨어 사이에서의 명령어를 처리하고 물리적인 하드웨어를 논리적으로 격리하여 가상화 하는 역할
게스트 OS들의 명령어를 하드웨어가 이해할 수 있도록 중간 역할을 하게 됨
전가상화와 반가상화가 있음

2. 컨테이너 가상화

호스트 OS에서 프로세스를 격리하여 가상화
호스트 OS의 리소스를 공유받아 하이퍼바이저 가상화보다 가볍게 가상화
별도의 하이퍼바이저나 게스트 OS가 필요없이 가상화 가능
→ 운영체제 수준의 가상화 기술이라는 것은, 하드웨어단까지 내려가지 않고 운영체제(호스트 OS)위에서 프로세스 격리를 통해 가상화가 진행되기 때문에 그것을 운영체제 수준에서 가상화 된다고 표현

하이퍼바이저 가상화와 컨테이너 가상화가 쓰이는 상황

각 장점의 상황에 맞게 사용
구체적인 상황은 모르겠으나, 각각의 장단점에 맞게 쓰일 것으로 유추

1. 하이퍼바이저 가상화의 장점

각 머신에게 하드웨어 리소스를 직접 할당하기 때문에 효율적인 리소스 활용 가능
여러 게스트 OS를 올릴 수 있기 때문에, 다양한 운영체제 지원이 가능(컨테이너의 경우 리눅스 커널의 도움을 받기 때문에 리눅스 기반 운영체제만 가능)

2. 컨테이너 가상화의 장점

호스트 OS 위에서 동작하여 리눅스 커널을 공유하기 때문에 오버헤드가 적어 가벼움
이미지 기반이기 때문에 관리와 배포에 용이

리눅스 커널이란

1. 커널의 분류

컴퓨터는 하드웨어와 소프트웨어로 나뉨
소프트웨어는 운영체제와 응용 프로그램으로 나뉨
운영체제는 커널과 시스템 프로그램으로 나뉨

2. 커널의 역할

운영체제의 중추 역할
→ 사용자가 하드웨어의 자원을 쉽게 사용할 수 있도록 시스템 콜을 통해 관리
메모리 관리/디바이스 관리/프로세스 관리 등
→ 하드웨어의 물리적 자원을 추상화하여 사용자가 쉽게 접근할 수 있도록 해줌

컨테이너의 원리

컨테이너는 리눅스 커널에서 제공하는 기술들로 만들어짐
cgroup, namespace 등과 같은 기능을 이용하여 프로세스 격리

cgroup

1. 역할

프로세스가 사용할 수 있는 리소스 제한(메모리, CPU, 네트워크 등)
리소스 상태 모니터링
→ 할당한 리소스 제한을 넘어버리면 OS가 해당 프로세스를 종료

namespace

1. 역할

프로세스 격리 기술
보안 측면, 리소스들을 격리 함으로써 해당 리소스가 문제가 생겨도 다른 리소스 사용에는 영향을 주지 않기 위함. → fault tolerance 관점일지도?

2. namespace 안에 namespace가 가능한가?

도커로 올린 컨테이너 안에 도커로 컨테이너 올릴 수 있는 것처럼 가능
격리 안에 격리
→ 같은 네임스페이스 안에서도 리소스를 격리 함으로써 더욱 세분화된 리소스 관리가 가능

3. 서로 다른 namespace끼리 연결 가능?

각각의 가상 네트워크 인터페이스 veth를 통해서 연결 가능
→ 서로 다른 파일 시스템 공유 가능

그 외

1. pivot_root를 통한 root 격리

초창기 chroot로 root 격리 시
탈옥 보안 문제 발생
pivot_root 사용
OS가 사용하는 루트 파일 시스템을 올려주는 역할
→ 루트 파일 시스템을 전환하는 과정에서 호스트 OS에도 영향을 줌
→ 호스트에게 영향을 주지 않는 격리의 상황이 필요
→ 네임스페이스 개발(마운트)

2. 유니온 파일 시스템(UFS)

여러 개의 파일 시스템을 하나의 파일 시스템에 마운트
여러 파일 시스템을 하나로 합치다 겹치는 부분은 마지막 파일 시스템으로 겹침(overlay)
→ 도커 이미지 빌드할때, dockerfile 변경 사항 없으면 기존 이미지 통해서 실행되고, 변경점이 있으면 새로 이미지 빌드 후 컨테이너가 실행 되는 이유

3. namespace만으로 컨테이너 구현?

컨테이너를 격리 관점으로만 보면 namespace로 가능
리소스 할당량처럼 프로세스를 관리 해줄 수도 있어야 하기 때문에 다른 리눅스 커널도 이용

컨테이너는 리눅스 기술

컨테이너 자체가 리눅스 커널의 기술을 이용하여 구현이 됨
→ 컨테이너에 대해 공부/설명하면서 리눅스를 공부/설명 안 할 수가 없는 관계

참고자료