스웜에 스택 배포하기
스웜에 스택 배포하기
Docker Engine을 스웜 모드로 실행하고 있다면, docker stack deploy 명령을 사용해 완전한 애플리케이션 스택을 스웜에 배포할 수 있어요. 이 deploy 명령은 Compose 파일 형식으로 작성된 스택 설명을 입력으로 받아요. 다만 docker stack deploy 명령은 Compose V1에서 사용하던 레거시 Compose 파일 버전 3 형식을 사용한다는 점을 기억해 두세요. 최신 Compose 사양으로 작성된 형식은 이 명령과 호환되지 않아요.
출처: 공식문서
본문
참고
docker stack deploy명령은 Compose V1에서 사용하던 레거시 Compose 파일 버전 3 형식을 사용해요. 최신 Compose 사양으로 정의된 형식은docker stack deploy명령과 호환되지 않아요.
Compose의 변천사가 궁금하다면 History of Compose 문서를 참고하세요.
시작하기 전에 필요한 것
이 튜토리얼을 따라 하려면 다음 두 가지가 필요해요.
-
스웜 모드로 실행 중인 Docker Engine
스웜 모드에 익숙하지 않다면 Swarm mode key concepts와 How services work 문서를 먼저 읽어 보는 게 좋아요.참고
로컬 개발 환경에서 실험해 보려면
docker swarm init명령으로 엔진을 스웜 모드로 전환할 수 있어요. 이미 멀티 노드 스웜을 운영 중이라면, 모든docker stack및docker service명령은 매니저 노드에서 실행해야 한다는 점을 잊지 마세요. -
최신 버전의 Docker Compose
Docker Compose 설치 페이지에서 최신 버전을 확인할 수 있어요.
Docker 레지스트리 설정하기
스웜은 여러 대의 Docker Engine으로 구성되기 때문에, 모든 엔진에 이미지를 배포하려면 레지스트리가 필요해요. Docker Hub를 사용해도 되고, 직접 레지스트리를 운영해도 돼요. 여기서는 나중에 버려도 되는 임시 레지스트리를 만드는 방법을 알려드릴게요.
-
스웜에 레지스트리를 서비스로 시작하세요.
$ docker service create --name registry --publish published=5000,target=5000 registry:2 -
docker service ls로 상태를 확인하세요.$ docker service ls ID NAME REPLICAS IMAGE COMMAND l7791tpuwkco registry 1/1 registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17REPLICAS아래에1/1로 표시되면 실행 중이라는 뜻이에요.0/1로 표시된다면 아직 이미지를 받아오는 중일 거예요. -
curl로 동작을 확인해 보세요.$ curl http://127.0.0.1:5000/v2/ {}
예제 애플리케이션 만들기
이 가이드에서 사용하는 앱은 Get started with Docker Compose 가이드의 히트 카운터 앱을 기반으로 해요. Redis 인스턴스에 카운터를 유지하고, 페이지를 방문할 때마다 카운터를 1씩 증가시키는 Python 앱이에요.
-
프로젝트 디렉터리를 만드세요.
$ 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파일을 만들고 다음 내용을 붙여 넣으세요.# syntax=docker/dockerfile:1 FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] -
compose.yaml파일을 만들고 다음 내용을 붙여 넣으세요.services: web: image: 127.0.0.1:5000/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpine
웹 앱의 이미지는 위에서 정의한 Dockerfile로 빌드돼요. 또한 앞서 만든 레지스트리의 주소인 127.0.0.1:5000으로 태그가 지정돼요. 이 부분은 앱을 스웜에 배포할 때 아주 중요하답니다.
Compose로 앱 테스트하기
-
docker compose up으로 앱을 시작하세요. 이 명령은 웹 앱 이미지를 빌드하고, Redis 이미지가 없다면 받아온 다음, 두 개의 컨테이너를 생성해요.엔진이 스웜 모드라는 경고 메시지가 보일 거예요. Compose는 스웜 모드를 활용하지 않고 모든 것을 단일 노드에 배포하기 때문에 나타나는 경고예요. 안심하고 무시해도 돼요.
$ 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 are 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 ...(build output)... Creating stackdemo_redis_1 Creating stackdemo_web_1 -
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/tcpcurl로 앱을 테스트해 볼 수 있어요.$ curl http://localhost:8000 Hello World! I have been seen 1 times. $ curl http://localhost:8000 Hello World! I have been seen 2 times. $ curl http://localhost:8000 Hello World! I have been seen 3 times. -
앱을 내리세요.
$ docker compose down --volumes Stopping stackdemo_web_1 ... done Stopping stackdemo_redis_1 ... done Removing stackdemo_web_1 ... done Removing stackdemo_redis_1 ... done Removing network stackdemo_default
생성한 이미지를 레지스트리에 푸시하기
웹 앱 이미지를 스웜 전체에 배포하려면, 아까 설정한 레지스트리에 이미지를 푸시해야 해요. Compose를 사용하면 아주 간단해요.
$ docker compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372
이제 스택을 배포할 준비가 끝났어요.
스웜에 스택 배포하기
-
docker stack deploy로 스택을 생성하세요.$ docker stack deploy --compose-file compose.yaml stackdemo Ignoring unsupported options: build 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:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d s1nf0xy8t1un stackdemo_web replicated 1/1 127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f실행 중이라면 두 서비스 모두
REPLICAS아래에1/1로 표시되는 걸 볼 수 있어요. 멀티 노드 스웜이라면 이미지를 받아와야 하므로 시간이 조금 걸릴 수 있어요.이전과 마찬가지로
curl로 앱을 테스트할 수 있어요.$ curl http://localhost:8000 Hello World! I have been seen 1 times. $ curl http://localhost:8000 Hello World! I have been seen 2 times. $ curl http://localhost:8000 Hello World! I have been seen 3 times.Docker의 내장 라우팅 메시 덕분에 스웜의 어떤 노드에서든 포트
8000으로 접근하면 앱으로 라우팅돼요.$ curl http://address-of-other-node:8000 Hello World! I have been seen 4 times. -
docker stack rm으로 스택을 내리세요.$ docker stack rm stackdemo Removing service stackdemo_web Removing service stackdemo_redis Removing network stackdemo_default -
docker service rm으로 레지스트리를 내리세요.$ docker service rm registry -
로컬 머신에서 실험만 해본 경우, Docker Engine을 스웜 모드에서 해제하려면
docker swarm leave를 사용하세요.$ docker swarm leave --force Node left the swarm.