Simple is IT, 누구나 보고 누구나 깨닫는 IT

Docker Network 구조는 어떨까, 그리고 종류는? (1/2) 본문

Simple is IT/Cloud & Container

Docker Network 구조는 어떨까, 그리고 종류는? (1/2)

currenjin 2020. 5. 28. 20:06

Docker Network 구조와 종류는 어떨까? - 1/2

 

많은 엔지니어, 개발자들이 사용하는 도커임에도 추상적인 네트워크에 대해 이해가 어려울 때가 많을 거에요.

 

그런 분들을 위해

이 두루뭉실한 네트워크 구조와 종류를 확실하게 파악하는 것이 포스팅의 목적이에요.

 

 

 

- Docker Network의 구조를 파악해보자 !

 

컨테이너 내부에서 인터페이스를 확인 해봅시다.

docker exec [container-id] ifconfig

 

output:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 4093  bytes 14274253 (14.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3092  bytes 171175 (171.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

확인해보니 일반 호스트와 다를게 없네요? eth0, lo Interface172.17.0.0/16 대역을 갖고 있음을 확인 했어요.

 

'172.17.0.2'는 해당하는 Subnet(172.17.0.0/16)에서 컨테이너에 순차적으로 IP를 할당하게 되어있어요.

또, 재시작 시 변경될 수도 있답니다.

 

해당 Subnet은 Docker Container 내부에서 할당하는 대역이에요. 즉, 바깥과 통신하기 위한 무언가가 필요하다는 말이죠.

 

 

HOW?

그렇다면 이 대역은 어떻게 바깥 네트워크 대역과 통신이 가능할까요?

이런 과정은 'Host'에서 컨테이너를 실행할 때마다 생성되는 veth... Interface와 연관이 있어요. 

 

Docker는 각 컨테이너의 외부 연결을 위해 컨테이너마다 가상 인터페이스를 하나씩 생성해주어야 합니다.

 

 

따로 생성해주지 않아도 네트워크는 잘 되는데요?

맞아요! 사실 가상 인터페이스는 사용자가 직접 생성하는 것이 아닌 도커 엔진에서 자동을 생성한답니다. veth...라는 이름으로 말이죠.

 

veth : virtual ethernet

 

 

 

컨테이너를 생성한 'Host'에서 인터페이스를 확인해봅시다.

ifconfig

 

output:

docker0   Link encap:Ethernet  HWaddr 02:42:bf:83:fa:71
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:bfff:fe83:fa71/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3092 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4085 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:127887 (127.8 KB)  TX bytes:14273605 (14.2 MB)

ens33     Link encap:Ethernet  HWaddr ...

lo        Link encap:Local Loop...

veth23890e1 Link encap:Ethernet  HWaddr 32:14:59:53:c6:30
          inet6 addr: fe80::3014:59ff:fe53:c630/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3092 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4093 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:171175 (171.1 KB)  TX bytes:14274253 (14.2 MB)

end33, lo, veth.. 그리고 docker0 Interface가 확인되었어요.

 

생성된 가상 인터페이스는 docker0이라는 'Bridge'도 존재하는데, 이 인터페이스는 각 veth...와 바인딩 되어 호스트 외부 인터페이스와 이어주는 역할을 해요.

 

 

아래 구성을 보시면 이해가 더 쉬울겁니다!

 

실제로 바인딩이 되었는지 확인

# brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242bf83fa71       no              veth23890e1

 

 

 

이번 포스팅은 Docker Network 구조에 대해서 알아보았습니다 !

정말 흥미로운 친구이지만 그 만큼 알아야 할 부분도 많겠지요.

 

다음 포스팅에서 Docker Network 구조를 기반으로 어떤 종류의 네트워크가 사용되는지를 알아볼게요.

감사합니다.

Comments