컨테이너 네트워킹은 모두 비슷한 방식으로 동작한다.
Docker, Rocket, Mesos, Kubernetes 등 각 플랫폼이 제각기 네트워킹 로직을 따로 구현
👉 "같은 걸 왜 다 따로 만들어?"
→ 표준화 필요 → CNI 탄생
컨테이너당 Network Namespace 생성
어떤 네트워크에 붙일지 결정
CNI 플러그인을 호출
네트워크 설정 JSON 파일 로드
| 명령어 | 역할 |
|---|---|
| ADD | 컨테이너 네임스페이스에 네트워크 추가 |
| DEL | 네트워크 제거 |
| CHECK | 상태 확인 및 검증 (선택적) |
{
"cniVersion": "0.4.0",
"name": "mynet",
"type": "bridge",
"bridge": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.22.0.0/16"
}
}
| 항목 | 설명 |
|---|---|
| Docker | CNI 사용 ❌ → 자체 표준 CNM 사용 |
| Kubernetes | CNI 사용 ⭕ |
→ Kubernetes는 Docker 컨테이너 생성 시 "none" 네트워크로 만들고, 이후 CNI 플러그인을 호출해서 네트워크 설정을 진행.
런타임이 컨테이너 생성
컨테이너용 Network Namespace 생성
런타임이 CNI 플러그인 호출 (Add)
플러그인은
런타임은 컨테이너 실행
컨테이너 종료 시 런타임은 CNI 플러그인 호출 (Del) → 네트워크 정리
| 런타임 역할 | 플러그인 역할 |
|---|---|
| Network Namespace 생성 | 인터페이스 생성 및 연결 |
| 어떤 네트워크에 붙일지 결정 | IP 할당, 라우팅, NAT 설정 |
| Add/Del 명령으로 플러그인 호출 | 네트워크 설정 및 결과 반환 |
| JSON 파일로 네트워크 정의 |
→ 런타임과 네트워크를 완벽히 분리하는 모듈화 구조