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)와 통신(서로 연결됨)이라는 두 가지를 동시에 해결한 방식