Docker Compose는 편리하긴 하지만 단일 호스트에서만 사용 할 수 있다. 실제 배포는 멀티호스트에서 이루어지기 때문에, 배포목적으로 사용하기는 애매모호하다. Rancher compose는 Docker compose의 멀티 호스트으로 분산된 노드에서의 컨테이너 실행을 관리한다. 따라서 개발과 테스트 뿐만 아니라, 실제 배포 목적으로 까지 사용 할 수 있다.
Rancer는 Manager & Agent 모델로 작동한다. Rancher Agent가 설치된 모든 호스트를 관리하며, 이들 호스트에 컨테이너를 배포 한다. 관리자는 컨테이너 배포를 위한 스케쥴을 만들 수 있다. 스케줄 룰이 없다면, 가장 적은 컨테이너가 있는 호스트에서 컨테이너를 실행한다.
Rancher는 Docker compose V1 버전의 docker-compose.yml 파일을 지원한다. Rancher는 rancher-compose.yml 파일과 docker-compose.yml 파일을 이용해서 컨테이너를 배포한다. rancher-compose.yml은 멀티 호스트에서의 컨테이너 관리를 위한 헬스체크, 스케일링 기능 들을 지원한다.
환경
테스트 환경을 구축하는 과정은 건너 뛴다. Rancher 서버 환경 구성은 rancher 소개 및 설치 문서를 참고하자. 나는 아래와 같이 테스트 환경을 만들었다.
버츄얼박스를 이용해서 3개의 우분투 서버 리눅스를 만들었다. 하나는 Rancher server, 나머지 두 대는 Rancher Agent가 설치된다. 워크스테이션(호스트 운영체제로 역시 우분투리눅스다)에는 docker-compose를 설치한다. 개발자(나)는 docker-compose를 이용해서 원격에 있는 Rancer Agent에 애플리케이션을 설치한다.
Rancher Compose 설치
rancher-compose release 페이지에서 실행파일을 다운로드 할 수 있다. 압축파일을 푼 다음에 /usr/bin등에 복사하자. Rancher Compose는 Rancher 인스턴스에 서비스를 실행한다. 이를 위해서는 몇가지 환경설정이 필요하다. 파일이름은 source.me 로 정했다.
# Rancer server URL
$ export RANCHER_URL=http://server_ip:8080/
# 유저 API 키
$ export RANCHER_ACCESS_KEY=<username_of_environment_api_key>
# API 호출을 위한 Secret 키
$ export RANCHER_SECRET_KEY=<password_of_environment_api_key>
Rancher Access Key와 Secret Key는 rancher server에서 발급받을 수 있다.
API 메뉴를 보면 Environment API Keys 메뉴가 보일 것이다. Add Envirionment API Key를 클릭하면 API Key를 발급 받을 수 있다. 이 키를 위에 있는 환경 변수에 등록하고 export 한다.
$ source source.me
Rancher compose를 이용한 웹 애플리케이션 서비스 전개
Flask 웹 애플리케이션을 전개하기로 했다. 이 Flask 웹 애플리케이션은 Redis를 이용해서 카운트 정보를 공유한다. 가용성을 위해서 2대의 Flask 웹 애플리케이션 컨테이너와 1대의 Redis 컨테이너를 설치한다.
Flask 애플리케이션을 위한 Dockerfile은 아래와 같다.
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
requirements.txt 파일의 내용은 아래와 같다.
$ cat requirements.txt
flask
redis
Dockerfile로 부터 도커 이미지를 만들어서 2대의 Rancher Agent 호스트에 설치하자. 프라이비 도커 레포지토리를 구성하면 되겠지만 귀찮아서 그냥 각 Agent 호스트에서 직접 빌드했다.
이제 rancher-compose를 실행하면 rancher-compose.yml을 읽고, docker-compose.yml 파일에 지시한대로 서비스를 올리게 된다. rancher-compose.yml을 보면 web서비스에 대해서 scale: 2를 설정했으므로 2개가 실행이 된다. up 명령을 이용해서 서비스를 올려보자.
$ rancher-compose up
WARN[0000] A newer version of rancher-compose is available: 0.12.5
INFO[0000] Creating stack flask
INFO[0000] [0/2] [redis]: Creating
INFO[0000] Creating service redis
INFO[0000] [0/2] [redis]: Created
INFO[0000] [0/2] [web]: Creating
INFO[0000] Creating service web
INFO[0000] [0/2] [web]: Created
INFO[0000] [0/2] [redis]: Starting
INFO[0002] [1/2] [redis]: Started
INFO[0002] [1/2] [web]: Starting
INFO[0004] [2/2] [web]: Started
flask-web-2 | 2017-06-06T08:50:36.560668542Z * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
...
compose 설정파일의 내용대로 컨테이너들이 실행되는 걸 확인 할 수 있다. rancer server의 Stack메뉴에서 실행한 컨테이너의 상세 정보를 확인 해 보자.
하나의 redis 와 2개의 flask 서버가 실행됐다. 이 2개의 flask 서버는 192.168.56.10, 192.168.56.11에 분산 설치됐다. curl로 테스트해보자.
$ curl 192.168.56.10:5000
Hello World! I have been seen 1 times.
$ curl 192.168.56.11:5000
Hello World! I have been seen 2 times.
Rancher-compose 명령들
Rancher-compose를 이용하면 CLI 환경에서, 인프라 스트럭처를 관리하기 위한 완전한 개발 환경을 만들 수 있다. 개발자는 Rancher key를 할당 받아서 자신의 워크스테이션에서 컨테이너 클러스터에 서비스를 올리고, 배포하고, 업그레이드 할 수 있다. CLI 툴이니 만큼 (약간의? 노력을 투자해서)이러한 과정을 완전히 자동화 할 수도 있다.
Rancher-compose 명령어를 테스트하기 위해서 아래와 같은 Rancher 클러스터 환경을 만들었다.
4대의 rancher node를 구성
하나의 rnacher server에서 관리
개발한 이미지를 배포하기 위한 docker registry 구성
개발자는 워크스테이션에서 rancher-compose 명령을 이용해서 컨테이너를 관리한다.
실제 환경에서는 로드밸런서로 Flask 서비스들을 하나로 묶어야 할 것이다. Rancher에서 제공하는 HAProxy 로드밸런서를 이용해서 묶을 수도 있고, Traefik와 같은 컨테이너 기반의 로드밸런서를 이용해서 묶을 수 있을 것이다. 다음 번에는 로드밸런서 구성을 해봐야겠다.
Contents
Rancher Compose
환경
Rancher Compose 설치
Rancher compose를 이용한 웹 애플리케이션 서비스 전개
Rancher-compose 명령들
Docker Registry에 등록
정리
Recent Posts
Archive Posts
Tags