Bridge Network - Switch

container는 namespace로 격리된 process Network namespace

  • 컨테이너가 자기만의 독립된 네트워크 환경을 가짐
  • 자기만의 인터페이스, IP, 라우팅 테이블, iptables 규칙 등

즉, 컨테이너 안에서 ip a 를 치면 호스트 인터페이스가 안보이고 자기 인터페이스만 보임

문제 - 그래서 격리된 컨테이너가 외부와 어떻게 통신해?

[Container A]
└─ eth0 (10.0.0.5/24)        ← 자기만의 네트워크 namespace
 
[Host]
└─ enp0s8 (192.168.56.100)   ← 진짜 물리 NIC

옵션 1

가장 단순하게 컨테이너가 자기 network namespace 안 만들고 호스트거 그대로 사용

장점은 빠르지만, 단점으로는 모든 컨테이너가 동일한 IP를 공유하면, CA가 80번 포트를 사용할 경우 CB는 80번 포트를 사용하지 못해서 격리의 의미가 없어짐

옵션 2

Linux에 veth pair 이라는 가상의 케이블 사용

[Container A]                [Container B]
	eth0    ──── 가상 케이블 ────    eth0

문제는 컨테이너가 많아지면 컨테이너 사이마다 케이블을 다 깔아야함

n개의 컨테이너면 n(n-1)/2개 케이블이 필요

옵션 3

Bridge Network

Bridge = 가상 스위치

예를 들어, 사무실에 컴퓨터가 4대가 있으면 각각을 다 케이블로 연결하지 않음

switch 라는 장비를 가운데 두고 모든 컴퓨터를 스위치에 연결함

스위치는 L2 장비 (MAC 주소만 보고 판단해서 패킷 전달)

브리지는 이 스위치를 소프트웨어로 만든거고, 리눅스 커널이 메모리상에 가상으로 생성

          [PC-A]

[PC-B] ─ [Switch] ─ [PC-D]

          [PC-C]
          
[Container A]                     
   eth0 ───┐                      

[Container B]                     
   eth0 ───┼─── [Bridge "docker0"]
           │      가상 스위치
[Container C]                     
   eth0 ───┘

각 컨테이너의 eth0가 veth pair로 브리지에 연결됨

한쪽 끝은 컨테이너 안에, 다른 쪽 끝은 호스트의 브리지에 연결

결론

결국 Bridge Network는 호스트 안에 가상 스위치를 두고 모든 컨테이너를 veth pair로 거기에 연결함으로써, 격리(자기만의 namespace)와 통신(서로 연결됨)이라는 두 가지를 동시에 해결한 방식