한 문장 요약
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 경로 보이는 방식 격리