Docker Network란 Docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능을 제공하는 것이다.
컨테이너화된 애플리케이션은 여러개의 컨테이너로 구성될 수 있는데, 이들 컨테이너가 서로 통신하고 데이터를 주고 받아야 할 경우가 있다.
Docker Network를 통해 이러한 컨테이너간 통신을 쉽게 설정하고 관리할 수 있도록 한다.
정리하자면, 같은 호스트 내에서 실행중인 컨테이너 간 연결할 수 있도록 돕는 논리적 네트워크 개념이다.
기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다. 위 스크린샷을 보면 lo 네트워크 인터페이스와 eth0 네트워크 인터페이스가 172.17.0.2가 할당된 것을 확인할 수 있다. 이 IP들은 내부 IP로 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며 도커가 설치된 호스트 내부에서만 접근할 수 있다.
외부와의 네트워크 연결은 컨테이너마다 eth0에 대응되는 veth라는 가상 네트워크 인터페이스를 호스트에 생성함으로써 이루어진다. 그리고 각각의 IP 주소와 포트를 입력해 컨테이너를 외부에 노출 시킬 수 있다. veth는 도커 호스트에서 ifconfig 명령어를 입력하면 확인 가능하다.
정리하면, eth0에 대응되는 vethXXXX이라는 이름의 veth interface와 브릿지 네트워크에 컨테이너의 interface가 바인딩되는 형태로 통신한다.
리눅스의 virtual ethernet interface, virtual eth를 의미한다.
랜카드에 연결된 실제 네트워크 인터페이스가 아니라 가상으로 생성한 네트워크 인터페이스이다. 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면, 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍(pair)로 생성해줘야 한다. 한 쪽에서 다른 쪽으로 패킷을 전송할 수 있으며, 한 쪽에 다운된 경우 나머지 한 쪽도 정상적으로 기능하지 않는 것이 특징이다. 도커에서는 실행중인 컨테이너 수 만큼 veth로 시작하는 인터페이스가 생성된다.
# 컨테이너 포트 연결 명령어
$ docker run -p [HOST IP:PORT]:[CONTAINER PORT] [CONTAINER NAME]
위의 명령어는 호스트의 80번 포트와 컨테이너의 80번 포트를 연결하여 컨테이너를 실행하는 명령어이다.
0.0.0.0:80 -> 80/tcp -> 위의 실행결과에서 Port를 해석하면 모든 호스트 IP의 80번 포트는 컨테이너의 80번 포트로 매핑이 된다는 것을 의미한다.
도커 네트워크 드라이버는 Native 와 Remote 로 나뉜다.
Native Drivers : Bridge,Host,None,Overlay 을 사용
Remote Drivers : 3rd party 드라이버로 외부에서 잘 만들어진 드라이버를 사용
포트를 연결해 컨테이너 애플리케이션의 Port 를 외부에 노출하는 방식이 bridge 네트워크이다.
아무런 네트워크 드라이버를 지정하지 않으면 default 로 docker0 이라는 bridge 네트워크 를 사용한다. (커스텀하게 생성도 가능)
host 네트워크는 도커가 제공해주는 가상 네트워크 인터페이스(veth) 을 사용하지 않고, host 의 네트워크에 붙어서 사용하는 네트워크이다.
그래서 bridge 네트워크 처럼 포트 바인딩을 할 필요가 없으며 호스트 네트워크에 접속하면 컨테이너 또한 접속 가능하다.
none 네트워크 는 해당 컨테이너가 네트워크 기능이 필요 없을 때, 혹은 커스텀 네트워크를 사용해야 되는 경우가 있을 때 네트워크 드라이버를 none 으로 설정하고 사용할 수 있다.
즉, 외부 네트워크와의 연결이 불가능하다.