Docker Network

  • Docker 컨테이너 간의 통신을 관리하고 격리하기 위해 Docker Network라는 개념이 존재한다.

  • 여러 컨테이너가 서로 통신하고 데이터를 주고받을 때 도커 네트워크를 통해 통신하도록 한다.

  • 같은 호스트 내에 실행중인 여러 컨테이너 간에 연결을 돕는 논리적 네트워크 개념이다.

veth

  • 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍으로 생성해줘야 한다.

  • veth는 한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 동작하지 않는다.

  • Docker는 호스트로부터 실행되는 컨테이너에 내부 IP(172.X..)를 순차적으로 할당한다.

  • 하지만 외부에서는 컨테이너 eth0의 IP에 접근할 수 없다. 즉, 도커로 MySQL을 띄우더라도 Spring Application에서는 접근하지 못하는 상황이 발생할 수 있는 것이다.

  • 이를 위해 실행중인 컨테이너마다 veth를 통해 외부 네트워크에 컨테이너 어플리케이션 주소를 노출시킨다.

네트워크 드라이버

  • Docker의 네트워킹 시스템은 여러 드라이버 중 선택하여 사용할 수 있다.

Bridge

  • Docker의 기본 네트워크 드라이버

  • 보통 동일한 호스트에 띄워진 다른 컨테이너와 통신할 때 사용된다.

  • 같은 bridge network상에 존재하는 컨테이너끼리 통신이 가능하며, bridge network에 연결되지 않은 컨테이너와는 연결할 수 없다.

  • 서로 다른 bridge network 상에 있는 컨테이너끼리 통신이 불가능하도록 하기 위해 bridge 드라이버는 호스트 시스템에 자동으로 규칙을 설정한다.

  • 유저가 정의한 bridge network와 docker 기본 bridge network에는 다음과 같은 차이점이 있다.

    • 유저가 정의한 bridge network는 자동 DNS 확인이 가능하다.

    • 유저가 bridge network를 정의하지 않은 채 컨테이너를 생성하면 모두 default bridge network로 설정되기 때문에 bridge network가 정의되지 않은 컨테이너끼리 통신이 가능하게 되버린다. 유저가 bridge network를 정의할 경우 네트워크를 분리하므로 더 좋다.

Host

  • 도커가 제공하는 veth를 사용하지 않고 직접 호스트의 네트워크를 사용하는 드라이버

  • 컨테이너 네트워크와 Docker 호스트 네트워크가 서로 고립되지 않도록 한다.

none

  • 외부 네트워크나 다른 컨테이너 네트워크와 단절시키는 드라이버

  • 해당 컨테이너가 네트워크 기능이 필요 없거나 커스텀 네트워크를 사용하는 경우 사용한다.

Last updated