Docker Network

최병훈·2024년 10월 16일
post-thumbnail

1)개요

  • 도커 컨테이너 및 서비스는 도커 네트워크를 통해 격리된 컨테이너 간의 네트워크 연결을 할 수 있다. 뿐만 아니라, 도커 외의 다른 애플리케이션 워크로드 와도 연결이 가능
  • 도커 네트워크의 하위 시스템 연결을 위해 도커 네트워크 드라이버를 이용해서 상호 간 통신이 가능
  • 도커 컨테이너는 별도의 설정을 하지 않는 한 docker0 이라는 브릿지에 연결되어 172.17.0.0/16의 CIDR 범위로 IP 주소가 할당됩니다.
  • 컨테이너를 생성하면 eth0 인터페이스 카드에 172.17.0.2 형태로 IP 주소를 할당해서 생성됩니다.
  • 확인: ifconfig docker0(ifconfig 명령이 없으면 apt install net-tools)

2)컨테이너를 생성하고 네트워크 설정을 확인

  • ubuntu:14:04 이미지를 가지고 컨테이너 2개 생성
    docker run --name container1 -dit ubuntu:14.04
    docker run --name container2 -dit ubuntu:14.04
  • 컨테이너 상세보기에서 IPAddress(MAC 정보)) 라는 항목을 확인하면 IP 할당을 확인
    docker inspect container1 | grep -i ipaddress
    docker inspect container2 | grep -i ipaddress
  • 컨테이너 상세보기에서 .NetworkSettings.IPAddress 그룹을 확인하면 네트워크 설정을 확인할 수 있음
    docker inspect -f {{.NetworkSettings}} container1
  • 리눅스 명령어에서 ifconfig(route, ip addr 등) 를 확인하면 네트워크 정보를 확인할 수 있음
    docker exec container1 ifconfig
  • 호스트 컴퓨터에서 ifconfig를 확인해보면 컨테이너 개수 만큼 인터페이스가 추가된 것을 확인할 수 있음
    ifconfig

3)도커 네트워크 드라이버

  • 도커 네트워크 드라이버를 사용할 때는 --net 이나 --network 명령을 이용해서 선택할 수 있고 docker network 명령을 통해서 호출해서 사용
    • bridge : 기본 네트워크 드라이버로 컨테이너로 실행 시 별도의 네트워크 지정없이 독립적으로 실행되는 애플리케이션 컨테이너를 실행하는 경우 사용. 브릿지 모드는 동일 호스트 상의 도커 컨테이너에만 적용
    • host : 컨테이너 와 호스트 간의 네트워크 격리를 제거하고 호스트의 네트워킹을 직접 사용. 이렇게 하면 컨테이너 애플리케이션에 별도의 포트 연결 없이 호스트의 포트를 바로 연결할 수 있음
    • overlay : 도커 클러스터인 도커 스웜 구축시 호스트 와 호스트 간의 컨테이너 연결에 사용
    • none : 네트워크 사용 안 함
    • container:공유받을컨테이너이름 : 다른 컨테이너의 정보를 공유
    • 사용자정의네트워크
  • host 모드 와 bridge 모드의 차이

    • nginx를 포트 설정없이 컨테이너로 실행

      docker run -d --name=noport nginx

      이 경우 컨테이너에서 서비스 하는 내용을 외부에서 사용할 수 없음

    • nginx를 브릿지 모드로 외부에서 접근할 수 있도록 컨테이너로 실행

      docker run -d --name=bridgeport -p 8001:80 nginx

      http://localhost:8001 로 서비스 받을 수 있습니다.

  • nginx를 호스트 모드로 외부에서 접근할 수 있도록 컨테이너로 실행
    docker run -d --name=host --net=host nginx
    http://localhost:80 로 서비스 받을 수 있습니다.

4)네트워크 생성 및 할당

  • 네트워크 생성

    docker network create [--driver=네트워크드라이버종류] 네트워크이름
  • 컨테이너에 네트워크 설정을 할 때는 컨테이너를 만들 때 --net 옵션에 네트워크 이름을 설정해주면 됩니다.

실습

  • 네트워크 생성(webapp-vnet, mobileapp-vnet)

    docker network create webapp-vnet
    docker network create --driver=bridge mobileapp-vnet
  • 네트워크 확인

    docker network ls

  • 네트워크를 설정해서 컨테이너 생성

    docker run -dit --name=webapp --net=webapp-vnet ubuntu:14.04
    docker run -dit --name=mobileapp --net=mobileapp-vnet ubuntu:14.04
  • IP 확인

    docker inspect webapp | grep IPAddress

    docker inspect mobileapp | grep IPAddress


    서브넷 마스크가 기본적으로 /16 이므로 위 2개의 컨테이너는 서로 다른 네트워크가 됩니다.

  • 네트워크 정보를 상세히 출력(할당된 컨테이너 확인 가능)
    docker network inspect webapp-vnet 
  • 브릿네트워크의 IP 대역은 순차적으로 할당되는데 이를 원하는 대역으로 설정하는 것이 가능한데 이 경우는 네트워크를 생성할 때 --subnet 그리고 --ip-range--gateway를 설정해주면 됩니다.

    • 네트워크 생성

      docker network create --ip-range 172.100.1.0/24 --subnet 172.100.1.0/24 --gateway 172.100.1.1 custom-net
    • 네트워크 확인

      docker network inspect custom-net

    • 컨테이너 생성

      docker run -dit --net=custom-net --name=cust-net1 ubuntu:14.04
      docker run -dit --net=custom-net --name=cust-net2 --ip 172.100.1.100 ubuntu:14.04
    • 하나의 컨테이너에 접속해서 ping 명령을 수행

      docker exec -it cust-net1 /bin/bash
      ping -c 4 127.100.1.100 #또는 ping -c 4 cust-net2

5)사용자 정의 네트워크를 이용해서 Load Balancing

  • 네트워크 생성(172.200.1.0/24)
    docker network create --subnet 172.200.1.0/24 --ip-range 172.200.1.0/24 --gateway 172.200.1.1 netlb
  • 네트워크 확인
    docker network ls 
  • docker run 수행 시 --net-alias 또는 --link 옵션으로 묶인 컨테이너에는 기본적으로 서비스를 검색할 수 있는 내장 DNS 서버가 제공되는데 이를 자동화 DNS 라고 하는데 이 DNS 때문에 사용자 정의 네트워크 안에서 컨테이너 이름 과 IP 주소가 매칭이 되는 것입니다.
  • ubuntu:14.04 이미지를 이용해서 netlb 네트워크에 속한 3개의 컨테이너를 생성하는데 net-alias를 inner-dns-net으로 설정
    docker run -dit --name=nettest1 --net=netlb --net-alias inner-dns-net ubuntu:14.04
    docker run -dit --name=nettest2 --net=netlb --net-alias inner-dns-net ubuntu:14.04
    docker run -dit --name=nettest3 --net=netlb --net-alias inner-dns-net ubuntu:14.04
  • ping을 전송할 새로운 컨테이너를 생성하는데 네트워크는 netlb

    docker run -it --name=frontend --net=netlb ubuntu:14.04 /bin/bash
  • 컨테이너가 생성되면 안에서 아래 명령을 여러 번 수행하면서 IP를 확인

    ping -c 2  inner-dns-net


    ip가 변하는 것을 확인할 수 있습니다.

  • frontend에서 DNS 정보를 확인

    • dnsutils 패키지를 설치

      apt-get update
      apt-get -y install dnsutils
    • 확인

      dig inner-dns-net

  • 다른 터미널을 실행시켜서 컨테이너를 하나 추가
    docker run -dit --name=nettest4 --net=netlb --net-alias inner-dns-net ubuntu:14.04
  • 이전 터미널에서 DNS 정보를 확인
    dig inner-dns-net

0개의 댓글