Docker 격리 원리
| topics | 400-인프라 & 아키텍처 |
| types | 실습 |
Docker = 여러 격리 기술의 조합. 리눅스 커널 기능으로 격리.
핵심 공식
Docker = Namespace + Cgroups + veth
Namespace = "뭘 볼 수 있나" (격리)
Cgroups = "얼마나 쓸 수 있나" (자원 제한)
veth = 네트워크 연결
Namespace 종류
PID namespace → 프로세스 ID 격리
Network namespace → 네트워크 격리 (자체 IP, 포트)
Mount namespace → 파일시스템 격리
UTS namespace → 호스트네임 격리
User namespace → 사용자 ID 격리
IPC namespace → 프로세스간 통신 격리
PID Namespace 예시
# <span id="호스트에서-보면"></span>호스트에서 보면
ps aux
# <span id="pid-12345-nginx-컨테이너-프로세스"></span>PID 12345: nginx (컨테이너 프로세스)
# <span id="컨테이너-안에서-보면"></span>컨테이너 안에서 보면
ps aux
# <span id="pid-1-nginx-자기가-1번인-줄-앎"></span>PID 1: nginx (자기가 1번인 줄 앎)
같은 프로세스인데 보이는 세상이 다름.
Network Namespace
각 네임스페이스는 독립적인 네트워크 스택 보유:
- 자체 IP 주소
- 자체 라우팅 테이블
- 자체 iptables 규칙
# <span id="네임스페이스-생성-docker가-내부적으로-하는-일"></span>네임스페이스 생성 (Docker가 내부적으로 하는 일)
ip netns add my_namespace
Cgroups (Control Groups)
자원 제한.
docker run --cpus=0.5 --memory=512m nginx
# <span id="이-컨테이너는-cpu-50-메모리-512mb만-사용-가능"></span>이 컨테이너는 CPU 50%, 메모리 512MB만 사용 가능
비유
Namespace = 각방 (서로 못 봄)
Cgroups = 전기/수도 할당량 (자원 제한)
veth = 각 방에 연결된 전화선 (네트워크)
네트워크 격리 과정
Docker가 컨테이너 만들 때 하는 일:
1. 네임스페이스 생성
2. veth pair 생성
3. 한쪽은 docker0 브릿지에 연결
4. 다른 쪽은 컨테이너 네임스페이스에 연결
5. IP 할당 (172.17.0.x)
6. iptables로 NAT 설정
컨테이너 = 격리된 프로세스
ps aux | grep nginx # 컨테이너 안 nginx도 호스트에서 보임
VM처럼 OS 전체를 에뮬레이션하는 게 아니라, 커널 레벨에서 "시야"와 "자원"만 분리. 그래서 가볍고 빠름.
네트워크 없이도 컨테이너는 돈다
# <span id="포트-매핑-없이-실행"></span>포트 매핑 없이 실행
docker run nginx
컨테이너는 돌아감. 단지 외부에서 접근 못할 뿐.
컨테이너 프로세스 ─┬─ 네트워크 필요 → IP:포트 바인딩
│
└─ 네트워크 불필요 → 그냥 실행만
(예: 배치 작업, 파일 처리)