# Docker Network

* Docker 컨테이너 간의 통신을 관리하고 격리하기 위해 Docker Network라는 개념이 존재한다.
* 여러 컨테이너가 서로 통신하고 데이터를 주고받을 때 도커 네트워크를 통해 통신하도록 한다.
* 같은 호스트 내에 실행중인 여러 컨테이너 간에 연결을 돕는 논리적 네트워크 개념이다.

> veth
>
> * 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍으로 생성해줘야 한다.
> * veth는 한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 동작하지 않는다.

* Docker는 호스트로부터 실행되는 컨테이너에 내부 IP(172.X..)를 순차적으로 할당한다.
* 하지만 외부에서는 컨테이너 eth0의 IP에 접근할 수 없다. 즉, 도커로 MySQL을 띄우더라도 Spring Application에서는 접근하지 못하는 상황이 발생할 수 있는 것이다.
* 이를 위해 실행중인 컨테이너마다 veth를 통해 외부 네트워크에 컨테이너 어플리케이션 주소를 노출시킨다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2F0TfkdXlPRg1frJ6T6ztS%2Fimage.png?alt=media&#x26;token=1fa0b7e8-57ac-47e5-8717-796af970c5c3" alt=""><figcaption></figcaption></figure>

## 네트워크 드라이버

* 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

* 외부 네트워크나 다른 컨테이너 네트워크와 단절시키는 드라이버
* 해당 컨테이너가 네트워크 기능이 필요 없거나 커스텀 네트워크를 사용하는 경우 사용한다.
