Docker Network
Last updated
Last updated
Docker 컨테이너 간의 통신을 관리하고 격리하기 위해 Docker Network라는 개념이 존재한다.
여러 컨테이너가 서로 통신하고 데이터를 주고받을 때 도커 네트워크를 통해 통신하도록 한다.
같은 호스트 내에 실행중인 여러 컨테이너 간에 연결을 돕는 논리적 네트워크 개념이다.
veth
일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍으로 생성해줘야 한다.
veth는 한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 동작하지 않는다.
Docker는 호스트로부터 실행되는 컨테이너에 내부 IP(172.X..)를 순차적으로 할당한다.
하지만 외부에서는 컨테이너 eth0의 IP에 접근할 수 없다. 즉, 도커로 MySQL을 띄우더라도 Spring Application에서는 접근하지 못하는 상황이 발생할 수 있는 것이다.
이를 위해 실행중인 컨테이너마다 veth를 통해 외부 네트워크에 컨테이너 어플리케이션 주소를 노출시킨다.
Docker의 네트워킹 시스템은 여러 드라이버 중 선택하여 사용할 수 있다.
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를 정의할 경우 네트워크를 분리하므로 더 좋다.
도커가 제공하는 veth를 사용하지 않고 직접 호스트의 네트워크를 사용하는 드라이버
컨테이너 네트워크와 Docker 호스트 네트워크가 서로 고립되지 않도록 한다.
외부 네트워크나 다른 컨테이너 네트워크와 단절시키는 드라이버
해당 컨테이너가 네트워크 기능이 필요 없거나 커스텀 네트워크를 사용하는 경우 사용한다.