Docker 네트워크

김영한·2021년 2월 3일
0

Devops

목록 보기
2/4

도커 네트워크 구조

도커 컨테이너는 호스트 내부에 격리된 어플리케이션 환경을 생성한다. 생성된 어플리케이션은 네트워크를 통해 내부, 외부와 통신하게 된다.

📕 veth, eth0

  • 도커는 컨테이너에 내부 IP를 순차적으로 할당한다.
  • 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있다.
  • 도커가 설치된 호스트에서만 쓸 수 있는 IP이므로 외부와 연결될 필요성이 있다.
  • 이 과정은 컨테이너를 시작할 때마다 호스트에 veth...라는 네트워크 인터페이스를 생성함으로써 이루어진다.(virtual eth라는 의미)
  • 각 컨테이너에 외부와의 네트워크를 제공하기 위해 가상 네트워크 인터페이스를 호스트에 생성한다.
  • 컨테이너가 생성될 때 도커 엔진이 자동으로 생성한다.

⭐ veth 인터페이스 뿐만 아니라 docker0라는 브리지도 존재하는데 docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는 역할을 한다.

📍 전체적인 그림

💡 즉, 정리하자면 컨테이너의 eth0 인터페이스는 호스트의 veth...라는 인터페이스와 연결되었으며 veth 인터페이스는 docker0 브리지와 바인딩되어 외부와 통신할 수 있게 된다.


도커 네트워크 기능

컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 선택에 따라 여러 네트워크 드라이버를 사용할 수도 있다.

💡 대표적인 네트워크 드라이버

브리지(bridge), 호스트(host), 논(none), 컨테이너(container) 등

📕 브리지

아무런 설정을 하지 않고 컨테이너를 생성하면 컨테이너는 자동으로 docker0 브리지를 사용하는데 이와 비슷하게 docker0가 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.

즉, 기존의 docker0를 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 네트워크를 생성할 수 있다.

아래와 같은 명령어를 통해 mybridge라는 브리지 타입의 네트워크를 생성할 수 있다.

docker network create --driver bridge mybridge

아래와 같은 명령어를 통해 mybridge 네트워크를 사용하는 컨테이너를 생성한다.

docker run -i -t --name mynetwork_bridge \
--net mybridge ubuntu:14.04

\ -> 줄바꿈

⭐ 이렇게 생성된 사용자 정의 네트워크는 docker network disconnect, connect를 통해 컨테이너에 유동적으로 붙이고 뗄 수 있다.(브리지와 오버레이와 같이 특정 IP 대역을 갖는 네트워크 모드에서만 가능)

📕 호스트

브리지 네트워크와 달리 네트워크는 별도로 생성할 필요없이 기존의 host라는 이름의 네트워크를 사용하고 호스트의 네트워크 환경을 그대로 쓸 수 있다.

docker run -i -t --name mynetwork_host \
--net host ubuntu:14.04

컨테이너의 호스트 이름도 무작위 16진수가 아닌 도커 엔진이 설치된 호스트 머신의 호스트 이름으로 설정된다.

⭐ 호스트 모드로 설정하면 컨테이너 내부의 어플리케이션을 별도의 포트 포워딩없이 바로 서비스할 수 있다.(마치 실제 호스트에서 어플리케이션을 외부에 노출하는 것과 같다.)

ex) 호스트 모드를 쓰는 컨테이너에서 아파치 웹 서버를 구동하면 호스트 IP와 컨테이너의 아파치 웹 서버 포트인 80으로 바로 접근 가능

📕 논

말 그대로 아무 네트워크도 쓰지 않는 것을 말한다.
즉, 외부와 연결이 단절된다.

docker run -i -t --name mynetwork_none \
--net none ubuntu:14.04

컨테이너 내부에서 ifconfig를 이용해 네트워크 인터페이스를 확인하면 로컬 호스트를 나타내는 lo 외에는 존재하지 않는다.

📕 컨테이너

다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.(내부 IP, 네트워크 인터페이스의 MAC 주소 등)

docker run -i -t -d --name mynetwork_container_1 \
ubuntu:14.04

docker run -i -t -d --name mynetwork_container_2 \
--net container:mynetwork_container_1 ubuntu:14.04

내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않는다.
ifconfig를 통해 확인하면 container1과 2는 eth0에 대한 정보가 같다.

📕 MacVLAN 네트워크

호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공한다.
따라서 컨테이너는 물리 네트워크상에서 가상의 MAC 주소를 가지며 해당 네트워크에 연결된 다른 장치와의 통신이 가능해진다.

(MacVLAN을 사용하는 컨테이너는 기본적으로 호스트와 통신이 불가능하다.)

0개의 댓글