알고싶은점
•
컨테이너를 알기 위해 리눅스를 알아야하는 이유
컨테이너
•
컨테이너 자체가 리눅스 컨테이너를 이용하는 것
•
리눅스 컨테이너는 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술
운영체제 수준의 가상화 기술의 의미
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로 가능
•
리소스 할당량처럼 프로세스를 관리 해줄 수도 있어야 하기 때문에 다른 리눅스 커널도 이용
컨테이너는 리눅스 기술
•
컨테이너 자체가 리눅스 커널의 기술을 이용하여 구현이 됨
→ 컨테이너에 대해 공부/설명하면서 리눅스를 공부/설명 안 할 수가 없는 관계