* 해당 포스트는 OSAM.OSS.KR 의 SW Dev Camp 일환으로 작성되었으며, CCL 라이센스를 따름.


    Docker LoadBalance


    Docker 1.11v 릴리즈에 'DNS Round Robin Load Balancing' 이 추가되었다. 이 글에선 해당 기능을 사용할 것이다.

    우선, DNS Round Robin Load Balancing(이하 로드밸런싱)에 대해 간단히 설명 하자면 DNS 질의할 때 같은 우선순위의 같은 IP를 받아와서 맨 처음 IP에 트래픽이 집중되는걸 방지하고자 다른 우선순위의 다른IP를 주는 것이다. 아래 사진을 보면 이해하기 쉬울 것이다.

    <좌; 개인 사이트, 로드밸런싱 미적용 / 우; 구글, 로드밸런싱 적용>


    Docker 에선 Network 로 컨테이너를 묶고, 하나의 네트워크 망을 구성하게 된다.

    Docker 를 기본 설치할 때 Network 는 다음과 같다.

    # docker network ls


    1. none - 지정하지 않음.

    2. host - 호스트 네트워크

    3. bridge - docker0 NIC 사용


    추가적으로 Network 를 추가할 수 있으며 이 글에서도 새로 네트워크를 구성하여 로드밸런싱을 구현한다.

    ( 만약 실수로 이상한 네트워크를 생성했을 경우 # docker network rm <이름>  을 통해 삭제할 수 있다. )

    # docker network create testnet


    다시 한번 네트워크를 확인해 보면 'testnet' 이란 네트워크가 정상적으로 생성되었음을 확인할 수 있다.

    # docker network ls

    # ifconfig

    < 이 글에서 testnet 의 ip는 172.18.0.0 대역으로 생성되었다 >


    네트워크가 정상적으로 설치 및 실행되었다면, 생성한 네트워크를 통해 컨테이너를 생성한다.

    ubuntu 생성 후 자동으로 해당 컨테이너의 bash 로 넘어가는데 exit 명령어로 빠져나간 뒤 나머지 컨테이너도 생성하자.

    # docker run -i -t --name test0 --net testnet --net-alias network ubuntu

    # docker run -i -t --name test1 --net testnet --net-alias network ubuntu

    # docker run -i -t --name test2 --net testnet --net-alias network ubuntu

    < test0, test1, test2 모두 설치 완료. >


    3개의 test 컨테이너를 모두 생성하였다면, testnet 에 접속하기 위한 frontend 컨테이너를 생성한다.

    # docker run -i -t --name front --net testnet ubuntu:14.04


    컨테이너 설치가 모두 완료되었다면, 정상적으로 설치 되었는지 다시한번 확인하자.

    # docker ps -a


    설치 직후 모든 컨테이너는 status 가 exited 상태이다. 해당 컨테이너를 실행시켜 주자.

    # docker start front

    # docker start test0

    # docker start test1

    # docker start test2


    시작 후 도커 컨테이너 IP를 확인해보면 앞서 생성했던 testnet 의 IP 대역으로 할당된 것을 확인할 수 있다.

    # docker inspect test0

    # docker inspect test1

    # docker inspect test2


    다음으로 front 로 들어간 뒤 ping 을 해보자.

    # docker exec -i -t front /bin/bash

    # ping network


    ping 을 할 때 마다 test0, test1, test2 의 ip로 ping 이 가는것을 확인할 수 있다.


    이 글을 따라 구축한 네트워크 환경은 다음과 같다.



    즉, internet <-> front <-> testnode 라는 셈이다.

    test0, test1, test2 를 설치할 때 alias 를 지정하였다. alias 를 지정하지 않은 컨테이너인 front 가 frontend 역할을 하고 그 안에서 접속을 나누어주는 샘이다. 또한 컨테이너 자체로 로드밸런싱이 되는것이 아닌 Docker 내부 DNS를 통해 Round-robln 방식으로 IP를 지정해주는 것이다.

    front 에 대해 외부로부터 포트포워딩을 해 주면 로드밸런싱 환경이 적용된 서비스를 제공할 수 있다.


    Posted by beumbae