티스토리 뷰
네트워크 인터페이스 (Network Interface)
네트워크 인터페이스는 존재할 수 있는 모든 네트워크 어댑터에 대한 지속적 인터페이스를 IP 계층에 제공하기 위해 네트워크 고유 장치 드라이버 및 IP 계층과 통신하는 네트워크 고유 소프트웨어입니다. 또한, 네트워크 인터페이스에는 네트워크 주소가 있습니다.
가상 머신과 마찬가지로 도커 컨테이너 또한 가상 IP를 할당받는데요, 기본적으로 도커는 172.17.0.xxx의 IP 주소를 순차적으로 컨테이너에게 할당합니다.
먼저, 호스트의 네트워크 인터페이스를 살펴보겠습니다.
여기서 우리는 docker0라는 네트워크 인터페이스를 확인할 수 있는데요, docker0는 실제 네트워크 어댑터가 연결되어있지 않은 가상의 리눅스 브릿지로, IP주소 172.17.0.1/16로 지정되어 있습니다. 또한 호스트의 IP 주소는 111.13.113.181입니다.
도커 서버는 리눅스 커널 내에서 컨테이너가 다른 컨테이너 또는 외부와 통신하기 위해 사용되는 이더넷 브릿지로서 호스트 시스템의 docker0 인터페이스를 생성하고 구성합니다. docker0 브릿지는 도커에 의해서 생성된 가상 인터페이스로, RFC1918에 의해 정의된 호스트 머신에서 사용하지 않는 범위 내에서 임의로 주소와 서브넷을 선택하여 docker0로 할당합니다. 모든 도커 컨테이너는 기본적으로 docker0로 연결되며, docker0에 연결된 컨테이너는 외부와 통신하기 위해 도커가 생성한 iptables NAT 규칙을 사용할 수 있습니다.
이제 컨테이너를 하나 생성하고, 그 컨테이너의 네트워크 인터페이스를 살펴보겠습니다.
생성된 컨테이너는 eth0라는 네트워크 인터페이스를 가지며, IP 주소는 172.17.0.2/16인 것을 확인할 수 있습니다.
포트 바인딩 (Port Bindnig)
아무런 설정을 하지 않았다면, 우리가 생성한 컨테이너는 외부에서 접근할 수 없으며, 도커 엔진이 설치된 호스트에서만 접근할 수 있습니다. 이 컨테이너를 외부에 노출시키기 위해서는 먼저 호스트와 연결이 되어야 합니다. 이를 위해서 우리는 eth0의 IP와 포트 번호를 호스트의 IP와 포트 번호에 바인딩해야 합니다.
다음의 명령어로 컨테이너를 실행하고, 아파치 웹서버를 설치합니다.
$ docker run -i -t --name network_test -p 9999:80 ubuntu:14.04
root@57db86df07c5:/# apt install apache2 -y
root@57db86df07c5:/# service apache2 start
여기서 눈여겨 볼 점은, -p 9999:80 부분입니다. -p 옵션의 입력형식은 다음과 같습니다.
-p [바인딩 할 호스트의 포트]:[바인딩 할 컨테이너의 포트]
만약 호스트의 9999 포트 번호와 컨테이너의 80 포트 번호로 올바르게 바인딩이 되었다면, 다음 그림처럼 나타낼 수 있습니다.
이제 올바르게 바인딩 되었는지 확인해봅시다. 호스트의 IP 주소인 110.13.113.181와 바인딩 된 포트번호인 9999를 사용하여 웹 브라우저에서 접속합니다. (물론 호스트에서 접속해야 합니다.) 만약 컨테이너가 올바르게 바인딩 되어 호스트와 연결이 되었다면, 아파치 웹 페이지가 보일 것입니다.
호스트에서 9999 포트로 접속했을 때 아파치 웹 페이지가 보이네요! 이제 우리는 컨테이너가 호스트와 연결된 것을 확인했습니다.
veth 인터페이스 (veth Interface)
앞서 우리는 성공적으로 호스트와 컨테이너를 연결했습니다. 하지만 어떻게 컨테이너와 호스트가 연결되었는지 아직 잘 모릅니다.
다시 한 번 컨테이너와 호스트의 네트워크 인터페이스를 확인해봅시다.
아니 이게 뭔가요? 아파치 서버를 설치하여 테스트 하는 동안, 우리가 모르는 사이 vethcf10e95라는 네트워크 인터페이스가 추가되었습니다.
외부와 연결을 해야할 경우, 도커 데몬은 호스트 머신에 veth라는 네트워크 인터페이스를 생성합니다. 생성된 veth 인터페이스는 호스트의 docker0 브릿지에 바인딩됩니다. 컨테이너는 자신이 가진 eth0 인터페이스와 docker0 브릿지에 바인딩 된 veth 인터페이스를 통해 docker0 브릿지와 연결이 됩니다. 이를 통해 결론적으로 컨테이너는 외부와 통신을 할 수 있게 됩니다.
따라서 현재 제 노트북에서 컨테이너와 연결된 네트워크 인터페이스는 다음 그림과 같이 나타낼 수 있습니다.
References
본 포스트는 다음의 주소를 참고하였습니다.
'Cloud Computing > Docker' 카테고리의 다른 글
[Docker] Ubuntu 18.04 도커 엔진(Docker Engine) 설치하기 (0) | 2020.06.08 |
---|---|
[Docker] 도커란? (1) | 2020.06.06 |
- Total
- Today
- Yesterday