한 문장 요약

Linux Container는 컨테이너 안에서 "init/systemd"를 돌리고, 여러 데몬/서비스를 한 "OS 인스턴스" 처럼 운영하는 패턴

그래서 흔히 System Container라고 부름(가벼운 VM처럼 쓰는 느낌)

설명

VM과 차이

핵심
----
VM은 하드웨어를 가상화해서 "각자 커널을 따로" 돌리고, LXC는 "하나의 호스트 커널 위에서 커널 격리 기능"으로 OS 환경을 분리
VM
 - 하드웨어 가상화
 - 하이퍼바이저 위에 게스트 커널/OS가 별도로 생성 -> 커널이 서로 다름(강한 격리)

Linux Container
 - 호스트 커널을 공유하면서, 특정 프로세스를 격리된 환경에 가둬 실행
 - "가벼운 VM"처럼 리눅스 시스템(OS 환경)을 컨테이너로 운영하고 싶을 때 많이 사용
	=> 이로 인해서, 컨테이너 본질은 "격리된 프로세스 집합"이고, "커널은 하나"

Docker와의 차이

핵심
----
LXC는 "리눅스 시스템(서버)처럼" 컨테이너를 다루는 쪽에 강하고, Docker/OCI는 "앱 배포 단위(이미지/레지스트리/표준 런타임)" 생태계가 핵심
Linux Container
 - OS 가상화에 가까움
 - 커널 격리 기능의 userspace 인터페이스로 system 또는 apllication container를 만들고 관리
	 - systemd/init, 여러 데몬, SSH등 "가벼운 VM 느낌"이 자연스러움

Docker/OCI
 - Application 가상화에 가까움
 - "이미지(레이어) -> Repo -> 배포" 흐름 + 런타임은 OCI(runc 등)로 표준화

LXC → libcontainer로 바뀐 이유

Docker는 호스트마다 LXC 패키지/버전 차이로 컨테이너 생성, 격리 동작이 달라지는 불안정이 생겨서, 이를 없애고 커널 격리 기능을 직접 제어하는 libcontianer로 전환
공식적으로 말한 핵심
-------------------
- Docker 0.9에서 libcontainer가 안정성을 크게 올려 기본으로 채택, LXC는 optional로 전환

실무적
------
- 의존성/변동성 감소을 위함
	- 호스트에 LXC 유저스페이스 도구가 있어야 함.
	- 배포판마다 버전/패치가 다름

Docker - daemon(+ 통신 흐름) (참고)

컨테이너를 만드는 커널 핵심 3요소

Namespaces

각 컨테이너가 "자신만의 시스템"처럼 보이게 만드는 격리 장치
 - PID NS     : 컨테이너 안에서는 PID가 1부터 시작(호스트 프로세스 목록 숨김)
 - Mount NS   : 마운트 트리 분리(컨테이너마다 다른 rootfs/마운트)
 - Network NS : 네트워크 스택 분리(인터페이스/라우팅/iptables 등)
 - UTS NS     : hostname / domainname 분리
 - User NS    : UID/GID 매핑(컨테이너의 root를 호스트의 일반 유저로 매핑 가능)
 - Cgroup NS  : cgroup 경로 보이는 방식 격리