본문 바로가기
Web/Infra

도커 네트워크의 구조

by EricJeong 2020. 9. 6.

도커 컨테이너는 호스트 내부에 격리된 어플리케이션 환경을 생성합니다. 각각의 어플리케이션은 네트워크를통해 내/외부와 통신합니다. 도커 엔진은 이 컨테이너들이 호스트의 네트워크를 사용할 수 있도록 컨테이너를 생성할 때 내부IP를 할당합니다. 내부 IP는 도커 내부에서만 사용하는 IP이므로 도커 엔진은 컨테이너가 외부와 통신하기 위해 호스트에 컨테이너를 위한 가상 네트워크 인터페이스를 생성합니다. 

 

veth, eth0

도커 엔진이 호스트에 생성한 가상 네트워크 인터페이스는 실제로 외부와 통신할 수 있으며, veth로 시작하는 이름을 가지고 있습니다. 컨테이너별로 생성된 veth 인터페이스는 컨테이너 내부 eth0 인터페이스와 연결됩니다. 컨테이너에 eth0 인터페이스가 생성되는 것은 아래와 같이 확인할 수 있습니다.

docker run -it ubuntu:14.04

root@bfe11377f565:/# ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:696 (696.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

docker0

컨테이너의 eth0 -> 호스트의 veth가 연결되었지만 아직 컨테이너는 외부와 통신할 수 없습니다. 가상 이더넷이 호스트의 eth0과 연동되지 않은 상태이기 때문입니다. 도커에서는 이를 위해 docker0 브릿지를 생성하여 관리합니다.

docker0 브릿지는 veth와 호스트 eth0를 바인딩합니다. 

 

네트워크 드라이버

eth0 => docker0 => veth => eth0 형태로 연동되는 네트워크 형식은 도커의 bridge 네트워크 드라이버를 사용하는 방식입니다. bridge 네트워크 드라이버 외에도 도커에는 여러 네트워크 드라이버가 존재하며 이를 선택하여 적용할 수 있습니다.

 

Bridge

도커에서 디폴트로 사용하는 네트워크 드라이버입니다. 컨테이너가 독립형으로 통신해야할 때 사용하는것이 일반적이며 위 docker0를 통한 통신도 bridge 드라이버를 사용하는 방식입니다. docker0가 아닌 새로운 사용자 브릿지를 생성하여 연동할 수도 있습니다. bridge 네트워크 드라이버는 외부 네트워크와 연결되지 않은 다른 컨테이너와의 연결을 격리합니다.

--link 명령어를 통해 컨테이너끼리 연결을 지정해줄 수 있지만, --link 명령어는 현재 사용을 권장하고있지 않습니다.

 

Host

컨테이너와 호스트의 네트워크 격리를 제거합니다. 즉 컨테이너는 호스트의 네트워크를 그대로 이용할 수 있게 됩니다. 컨테이너에서 아파치 웹 서버를 80포트에 띄운다면 별도의 포트포워딩설정 없이 호스트의 80포트에 웹 서버가 올라갑니다. 외부에서 호스트의 80포트에 접근한다면 컨테이너로 바로 접근할 수 있게됩니다. 컨테이너 네트워크 격리를 할 필요가 없으므로 컨테이너의 내부 IP를 할당해주지 않습니다.

 

Macvlan

외부 물리 네트워크 장치를 사용하여 컨테이너의 가상 네트워크 인터페이스에 MAC 주소를 할당하여 물리적으로 연결된 물리 네트워크 장비처럼 작동하도록 만듭니다. Docker Demon은 MAC 주소를 최우선으로 라우팅합니다.

 

None

도커 데몬에 별도 네트워크를 할당하지 않습니다. 컨테이너는 내부/외부 모든 네트워크를 사용하지 않습니다.

댓글