Contents

Swarm 모드에서 compose 애플리케이션 배포

이 문서의 내용을 테스트하기 위해서는 아래의 내용들을 알고 있어야 한다. 도커 컴포즈를 이용하면 서비스 스택을 만들어서 애플리케이션을 배포할 수 있다. 하지만 도커 컴포즈는 호스트레벨에서만 작동을한다. 도커 스웜을 이용해서 컴포즈 서비스 스택을 도커 스웜 클러스터에 배포해보기로 했다.

VirtualBox를 이용해서 아래와 같이 테스트 환경을 만들었다.

 도커 테스트 환경

3개의 노드로 구성된 도커 클러스터를 구성한다. swarm01이 swarm manager이고 swarm02, swarm03은 swarm worker이다.
  1. 우분투 17.04 서버 버전
  2. docker Version: 17.09.0-ce
  3. docker compose Version: 1.17.0
구성한 도커 클러스터 상태다.
sudo docker node ls
ID                            HOSTNAME     STATUS    AVAILABILITY        MANAGER STATUS
v6ff0ydx2lclq31p1bccltbm6     swarm03      Ready     Active              
x30spno5bvm1sxhrvxuh8xzj8 *   swarm01      Ready     Active              Leader
b3sczq5ud2fyao5aekpgp6p4a     swarm02      Ready     Active              

도커 레지스트리 설치

swarm01(swarm manager)에서 도커 레지스트리를 설치한다.
# docker service create --name registry -p 5000:5000 registry:2
6pkajr23y1uipyu83qhhnhq1d

예제 프로그램

이 애플리케이션은 redis와 flask로 이루어진 예제 애플리케이션을 개발하자. 애플리케이션 스택의 이름은 stackdemo다.
$ mkdir stackdemo
$ cd stackdemo
애플리케이션의 이름은 app.py다.
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)
파이선 애플리케이션 패키지 정보를 담은 requirements.txt 파일을 만든다.
flask
redis
Dockerfile 을 만들었다.
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

예제 프로그램 실행

docker-compose up -d명령을 실행해보자. 애플리케이션 이미지를 만들고 redis 이미지를 pull해서 컨테이너를 실행할 것이다.
# docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Creating network "stackdemo_default" with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
3.4-alpine: Pulling from library/python
49388a8c9c86: Pull complete
....
docker-compose ps 명령으로 실행중인 앱을 확인해 보자.
# docker-compose ps
      Name                     Command               State           Ports         
-----------------------------------------------------------------------------------
stackdemo_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
stackdemo_web_1     python app.py                    Up      0.0.0.0:8000->8000/tcp
curl로 테스트했다.
# curl localhost:8000
Hello World! I have been seen 1 times.
# curl localhost:8000
Hello World! I have been seen 2 times.
앱을 내려보자.
# docker-compose down
Stopping stackdemo_web_1   ... done
Stopping stackdemo_redis_1 ... done
Removing stackdemo_web_1   ... done
Removing stackdemo_redis_1 ... done
Removing network stackdemo_default

앱을 도커 레지스트리에 Push 하기

우리가 만든 앱은 스웜모드로 올린게 아니라서 로컬에서만 실행된다. 스웜 클러스터에 앱을 분산배치해보자. 먼저 우리가 만든 앱을 도커 레지스트리에 Push 한다.
$ docker-compose push
WARNING: Some services (web) use the 'deploy' key, which will be ignored. 
Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Pushing web (192.168.56.11:5000/stackdemo:latest)...
The push refers to a repository [192.168.56.11:5000/stackdemo]
e52e4ee19bc4: Pushed
d2ea42aaac01: Pushed
521c4279451a: Pushed
214157132d4c: Pushed
53d439d12cbb: Pushed
12211dbcbe79: Pushed
ef763da74d91: Pushed
latest: digest: sha256:8be8dccc3dabe341a5e9a9bcca2c42592b68549d9c9f12b74bdfff7adae911b4 size: 1786
이제 docker stack deploy명령으로 애플리케이션 스택을 스웜 클러스터에 배포 할 수 있다.
$ docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build, links

Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis
docker stack services stackdemo명령으로 실행중인 스택을 확인 할 수 있다.
$ docker stack services stackdemo

ID            NAME             MODE        REPLICAS  IMAGE
orvjk2263y1p  stackdemo_redis  replicated  1/1       redis:3.2-alpine@sha256:f1ed3708f5....
s1nf0xy8t1un  stackdemo_web    replicated  1/1       127.0.0.1:5000/stackdemo@sha256:ad....
curl로 테스트를 해보자.
$ curl 192.168.56.12:8000
Hello World! I have been seen 4 times.
$ curl 192.168.56.11:8000
Hello World! I have been seen 5 times.
$ curl 192.168.56.10:8000
Hello World! I have been seen 6 times.
모든 스웝노드에 대해서 curl 호출이 성공하는 걸 확인 할 수 있다. 고맙게도 routing mesh 기능을 내장하고 있기 때문에 어떤스웜노드:8000 으로 접근하면 도커가 알아서 라우팅을 해준다.

rm 명령으로 스택을 다운할 수 있다.
$ docker stack rm stackdemo
Removing service stackdemo_redis
Removing service stackdemo_web
Removing network stackdemo_default