도커 네트워크

코모도왕도마뱀·2025년 4월 7일
6

네트워크

목록 보기
4/4

컨테이너는 스스로를 가둔다.
그러나 네트워크는 그 감옥에 다리를 놓는다.
연결은 의지다.

가상 네트워크

물리적인 장치 없이 소프트웨어만으로 구성된 네트워크이다.
Docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능을 제공하는 것이다.
같은 호스트 내에서 실행 중인 컨테이너 간 연결할 수 있도록 돕는 논리적 네트워크 개념이다.

가상 인터페이스

네트워크 인터페이스(Network Interface)컴퓨터나 장치가 네트워크와 상호작용하기 위한 연결점이며, 데이터를 주고받을 수 있는 하드웨어 또는 소프트웨어 구성 요소입니다. 네트워크 인터페이스는 컴퓨터와 네트워크 간의 통신을 가능하게 하며, 데이터 전송과 수신을 처리합니다.

알다시피, 도커는 소프트웨어 프로그램이다.
이전 글에서 보았던 네트워크 인터페이스는 랜카드를 이용하여 통신을 하였다.
도커에서는 eth0과 veth라는 가상 네트워크 인터페이스를 두어 통신한다.

veth는 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍으로 생성해줘야 한다.
한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 기능하지 않는 것이 특징입니다.
도커에서는 실행중인 컨테이너 수 만큼 veth 로 시작하는 인터페이스가 생성됩니다.

도커 네트워크 드라이버

도커 네트워크 드라이버는 Native와 Remote로 나뉜다.
Native Driver는 Bridge, Host, None, Overlay를 사용하고,
Remote Driver는 3rd party 드라이버로 외부에서 잘 만들어진 드라이버를 사용한다.
이 중 우리가 살펴볼 네트워크 드라이버는 총 3가지로 Native Driver에 속하는 Bridge, Host, None이다.

Bridge

포트를 연결해 컨테이너 애플리케이션의 Port 를 외부에 노출하는 방식이 bridge 네트워크이다.
아무런 네트워크 드라이버를 지정하지 않으면 default 로 docker0 이라는 bridge 네트워크를 사용한다.

Host

host 네트워크는 도커가 제공해주는 가상 네트워크 인터페이스(veth) 을 사용하는 것이 아니라 이름 그대로 host의 네트워크에 붙어서 사용한다.
그래서 bridge 네트워크 처럼 포트 바인딩을 할 필요가 없으며 호스트 네트워크에 접근하면 컨테이너 또한 접근할 수 있다.

None

None 네트워크는 해당 컨테이너가 네트워크 기능이 필요 없을 때, 혹은 커스텀 네트워크를 사용해야 되는 경우가 있을 때 네트워크 드라이버를 none 으로 설정하고 사용할 수 있다.
즉 외부 네트워크와의 연결이 단절된다.

도커 네트워크 구조

앞서 언급했던 것처럼 도커 컨테이너도 결국 네트워크를 구성한다. 따라서 컨테이너마다의 IP와 포트가 존재한다.
도커는 호스트로부터 실행되는 컨테이너에 172.17.0.x 의 IP 을 순차적으로 할당한다.

도커 컨테이너에 아무런 설정을 하지 않는다면 외부에서 접근할 수 없으며 오로지 해당 도커 컨테이너를 구동시킨 호스트에서만 접근 가능합니다.

그러면 도커 컨테이너는 외부와 통신할 수 없는걸까?

외부 네트워크에 컨테이너 어플리케이션을 노출하기 위해서는 eth0의 IP/PORT 을 호스트의 IP/PORT에 바인딩시켜야한다.

즉, eth0에 대응되는 vethXXXX이라는 이름의 veth interface와 브릿지 네트워크에 컨테이너의 interface가 바인딩되는 형태로 통신합니다.

veth 인터페이스는 사용자가 직접 생성할 필요는 없고 컨테이너가 생성될 때 도커 엔진이 자동으로 생성된다.
도커 컨테이너가 실행될 때 네트워크 드라이버를 따로 지정하지 않으면 docker0라고 하는 브릿지 네트워크를 기본으로 사용하게된다.
이 브릿지 네트워크의 역할은 veth와 호스트의 eth0의 다리 역할을 합니다.

내가 작성한 네트워크 시리즈 글을 읽고있는 중이라면 이러한 형태를 보았을 것이다.
포트끼리 연결하고 바인딩한다? 그렇다 이는 포트포워딩이다.

도커 네트워크 문법

도커 네트워크 명령어

네트워크 목록 확인

docker network ls

네트워크 생성

docker network create <네트워크명>

네트워크 삭제

docker network rm <네트워크명>

컨테이너에 네트워크 연결

docker network connect <네트워크명> <컨테이너명>

컨테이너에서 네트워크 분리

docker network disconnect <네트워크명> <컨테이너명>

네트워크 상세 정보 확인

docker network inspect <네트워크명>
profile
생각은 깊게, 실행은 단순하게.

0개의 댓글