docker network란 컨테이너끼리 통신하거나, 컨테이너와 외부 리소스가 통신하기 위해 설정되는 네트워크 시스템이다. 사용자가 원하는 방식에 따라서 네트워크 드라이버를 다르게 설정하여 다양한 방식의 네트워킹을 구현할 수 있다.
MacOS, WindowOS에서는 docker network 동작 방식이 Linux OS에서와 다르다. docker 엔진은 리눅스 커널을 이용해 컨테이너 격리를 구현하지만 Mac, Window에서는 리눅스 커널을 직접 사용하지 않기 때문이다. 따라서 Mac, Window 환경에서는 Linux 가상머신을 생성하고 가상머신 위에서 docker 엔진을 구동한다.
docker가 직접 Mac, Window 위에서 구동되는 것이 아닌 Linux 가상머신에서 동작하고 있음을 어떻게 알 수 있을까? 이를 확인하기 위해 docker 엔진 정보를 확인하는 명령어를 실행해보자.
docker info
MacOS에서 위 스크립트를 실행하였을 때 나오는 출력의 일부이다. 분명 맥에서 구동하였는 데에도 불구하고 OSType
이 linux
로 나오는 것을 알 수 있다.
위와 같이 다르게 동작하는 이유와 docker network 동작 원리에 대해서 알아보자.
linux가 아닌 환경의 docker 엔진 동작 과정을 보기 전에 간단하게 linux 환경에서의 docker 엔진이 컨테이너를 격리시키는 과정을 살펴보자.
docker는 기존 가상머신 환경과 다르게 hypervisor, guest os를 사용하지 않고 docker engine 내부에서 linux 커널 기능을 사용한다. 리눅스 namespace를 이용하여 프로세스를 독립시키고 cgroups를 이용해 컴퓨팅 자원을 독립시킨다.
위와 같은 기술을 이용해 docker는 가볍고 격리 가능한 프로세스를 만들어 독립적인 실행환경을 지원한다.
linux가 아닌 환경에서는 리눅스 커널 기능을 직접 사용하지 못한다. 따라서 docker는 리눅스 커널 기능을 사용하기 위해 추가적인 환경을 구성한다.
linux가 아닌 환경(Mac, Window)에서의 docker 엔진 실행 구조는 다음과 같다.
위 linux 환경에서의 그림과 다르게 hypervisor, guest os가 추가된 것을 볼 수 있다. linux 커널 기능을 사용하기 위해 linux 가상머신을 생성해 그 가상머신 위에서 docker 엔진을 구동하는 아이디어다. 가상머신을 생성하기 위한 hypervisor와 그 위 linux 가상머신이 추가되었다.
이렇게 생성된 가상머신은 호스트와 생성된 가상 네트워크 인터페이스를 이용해 통신하며, 가상머신 내에서는 linux 환경에서 실행한 docker와 동일하게 가상 이더넷 인터페이스를 만들어 컨테이너끼리 통신 가능한 네트워크를 구성한다. 가상머신은 호스트와 격리되어 있기 때문에 가상머신 내 컨테이너에서 외부 인터넷 접속을 위해서는 NAT를 통과해 통신한다.
linux 환경에서의 동작과 비교해 중간 가상머신 레이어가 하나 추가된 것이다.
위에서 본 것과 같이 OS에 따라서 docker network 동작 방식이 다르다. 이 때문에 사용에 제한이 걸리는 부분 등의 차이점이 존재한다.
linux가 아닌 환경에서는 호스트 시스템을 직접 사용하는 것이 아니기 때문에 일부 네트워크 드라이버 사용이 제한된다.
docker network는 여러 드라이버를 지원한다.
위 드라이버 중 host, macvlan, ipvlan은 호스트 네트워크를 직접 사용하는 드라이버이다. linux가 아닌 환경에서는 호스트 시스템을 직접 사용하지 않고 컨테이너 입장에서는 가상머신이 호스트로 식별되기 때문에 위 3개의 드라이버는 사용이 불가능하다.
직접 리눅스 커널 기능을 사용하는 것이 아닌 가상머신을 이용한 간접적 사용이기 때문에 hypervisor, guest os 오버헤드가 존재한다. 물론 hyperkit와 같은 경량 가상머신 하이퍼바이저를 사용하지만 사용하지 않는 것보다 오버헤드가 존재할 수밖에 없다.
생성된 컨테이너는 네트워크 구성에 따라서 서브넷 대역 안 IP를 할당받는다. 이 때 가상머신 위에서 컨테이너 실행되기 때문에 가상머신 네트워크 서브넷 대역 안에서만 IP를 할당 받을 수 있다. 호스트 내 네트워크 서브넷 대역 IP를 할당받지 못한다.
FAQs for Docker Desktop for Mac
GitHub - docker/for-mac: Bug reports for Docker Desktop for Mac