Docker LoadBalance.
* 해당 포스트는 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 에 대해 외부로부터 포트포워딩을 해 주면 로드밸런싱 환경이 적용된 서비스를 제공할 수 있다.