Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능하다. 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해잔다. 다시말해, Docker 네트워크는 컨테이너 간 네트워킹이 가능하도록 도와주는 역할을 한다.
네트워크 종류
Docker는 목적에 따라 다양한 종류의 네트워크 드라이버를 지원한다. 그 종류에 대해 알아보자.
-
none
none 네트워크에서 도커 컨테이너는 서로 독립되어서, 정보를 전혀 주고받을 수 없다. 호스트 외부로 접근하는 경우에도 네트워크가 연결되지 않는다.
-
host
host 네트워크에서는 host와 컨테이너가 네트워크의 구분 없이 서로 면결된다. 만약 컨테이너가 80 포트로 listening하고 있다면 호스트의 80 포트로 들어오는 요청을 같이 받을 수 있다. 추가적인 포트 매핑이 필요 없다. 다른 컨테이너의 80 포트를 열어놓으면, 충돌되어 생성되지 않는다.
-
bridge
bridge 네트워크는 컨테이너 사이에 임의의 네트워크가 구성되어있는 형태이다. 각 컨테이너끼리는 기본적으로
127.0.0.1
(localhost)를 통해 각각 네트워킹할 수 있다.아까 예시로 보았던
docker network ls
결과의 bridge가 바로 이 bridge를 의미하는 것이다.호스트에서는 이 네트워크를
docker0
라는 이름으로 생성하고,172.17.0.1
IP를 할당한다. docker0는 호스트 내부에서 컨테이너간의 통신을 조정하는 스위치와 같은 역할을 한다. 도커는 컨테이너가 생성될 때 마다 해당 컨테이너에 인터페이스를 생성하고 bridge에 연결하는 과정을 자동으로 수행해준다. 자세한 구현에 대한 것은 network namespace에 대한 내용을 참고하면 좋다.외부의 트래픽을 컨테이너의 특정 포트로 연결해주는 포트포워딩 기능도 제공한다. (내부적으로는 iptable을 사용한다.)
참고