ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 네트워크(Docker Network)
    BackEnd/docker 2022. 3. 9. 10:41
    반응형

      도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth(virtual eth)로 시작합니다. veth 인터페이스는 사용자가 직접 생성할 필요는 없으며 컨테이너가 생성될 때 도커 엔진이 자동으로 생성합니다. 도커가 설치된 호스트에서 ifconfig나 ip addr과 같은 명령어로 네트워크 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 알 수 있습니다. (mac이나 window OS에서는 docker0 브릿지나 veth 인터페이스들이 VM 안에 있기 때문에 확인할 수 없습니다.)

     

    • eth0: 공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있는 호스트의 네트워크 인터페이스
    • docker0: 브리지(bridge)로 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는 역할
    • veth: 컨테이너 시작 시 생성, 각 컨테이너의 eth0과 연결

     

      도커가 자체적으로 제공하는 대표적인 네트워크 드라이버로는 브리지(bridge), 호스트(host), 논(none), 컨테이너(container), 오버레이(overlay)가 있습니다. 서드파티(third-party) 플러그인 솔루션으로는 weave, flannel, openvswitch 등이 있으며, 더 확장된 네트워크 구성을 위해 활용됩니다.

     

      docker network ls 명령어로 네트워크 목록을 확인할 수 있으며, docker network inspect 명령어로 네트워크의 자세한 정보를 확인할 수 있습니다.

    $ docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    966597ff4cdd   bridge    bridge    local
    978d2ac58bb6   host      host      local
    02a1a2f06fd1   none      null      local
    
    $ docker network inspect bridge

     

    브리지 네트워크

      기본적으로 존재하는 docker0을 사용하는 브리지 네트워크가 아닌 새로운 타입의 네트워크를 생성하고, 해당 네트워크를 사용하는 컨테이너를 생성하겠습니다. docker run 또는 create 명령어에 --net 옵션의 값을 설정하면 컨테이너가 지정된 네트워크를 사용하도록 설정할 수 있습니다.

    # 네트워크 생성
    $ docker network create --driver bridge mybridge
    89c2b8e84dd3af73b9c9028245b90feb910b49d185055de81b98e381a6c78f39
    
    # 컨테이너 생성
    $ docker run -i -t --name mynetwork_container \
    --net mybridge \
    ubuntu:14.04
    
    # 네트워크 연결 해제
    $ docker network disconnect mybridge mynetwork_container
    
    # 네트워크 연결
    $ docker network connect mybridge mynetwork_container

      connect, disconnect 명령어는 특정 IP대역을 갖는 네트워크 모드에만 사용할 수 있습니다. 네트워크의 서브넷, 게이트웨이, IP 할당 범위 등을 임의로 설정하려면 네트워크를 생성할 때 아래와 같이 --subnet, --ip-range, --gateway 옵션을 추가합니다. (단 --subnet과 --ip-range는 같은 대역이어야 합니다.)

    $ docker network create --driver=bridge \
    --subnet=172.72.0.0/16 \
    --ip-range=172.72.0.0/24 \
    --gateway=172.72.0.1 \
    my_custom_network

     

    호스트 네트워크

      네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있습니다. 컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 바로 서비스할 수 있습니다.

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

     

    논 네트워크

      none은 말 그대로 아무런 네트워크를 쓰지 않는 것을 뜻합니다.

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

     

    컨테이너 네트워크

      --net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있습니다.

    $ docker run -i -t -d --name network_container_1 ubuntu:14.04
    
    $ docker run -i -t -d --name network_container_2 \
    --net container:network_container_1 \
    ubuntu:14.04

      위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않습니다. network_container_2 컨테이너의 네트워크와 관련된 사항은 전부 network_container_1과 같게 설정됩니다.

     

    브리지 네트워크와 --net-alias

      브리지 타입의 네트워크와 run 명령어의 --net-alias 옵션을 함께 쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있습니다.

    $ docker run -i -t -d --name network_alias_container1 \
    --net mybridge \
    --net-alias myalias ubuntu:14.04
    
    $ docker run -i -t -d --name network_alias_container2 \
    --net mybridge \
    --net-alias myalias ubuntu:14.04

      도커는 사용자가 정의한 브리지 네트워크에 사용되는 내장 DNS 서버를 가지며, DNS의 IP는 127.0.0.11입니다. 컨테이너의 IP는 DNS 서버에 myalias이라는 호스트 이름으로 등록됩니다.

     

    MacVLAN 네트워크

      MacVLAN은 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공합니다. 따라서 컨테이너는 물리 네트워크상에서 가상의 맥(MAC) 주소를 가지며, 해당 네트워크에 연결된 다른 장치와의 통신이 가능해집니다. MacVLAN에 연결된 컨테이너는 기본적으로 할당되는 IP 대역인 172.17.X.X 대신 네트워크 장비의 IP를 할당받기 때문입니다.

     

    Note. MacVLAN 네트워크를 사용하는 컨테이너는 기본적으로 호스트와 통신이 불가능합니다.

    반응형

    'BackEnd > docker' 카테고리의 다른 글

    컨테이너 자원 할당 제한  (0) 2022.03.12
    컨테이너 로깅(Container Logging)  (0) 2022.03.12
    도커 볼륨(Docker Volume)  (0) 2022.03.06
    도커 컨테이너(Docker Container)  (0) 2022.03.06
    도커 엔진(Docker Engine)  (0) 2022.02.26

    댓글

Designed by Tistory.