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을 사용한다.)
docker run -p 8080:80 nginx
참고