Docker Stack
· Version : Docker
이 문서는 Docker 공식 문서를 번역한 내용이며 필자의 생각과 의견이 반영되어 있습니다. 자세한 내용은 원문을 참고 바랍니다.
Prerequisites
Docker Stack을 학습하기 전에 아래 사항이 선행되어야 한다.
· Docker Install : https://docs.docker.com/install/
· Docker Orientation : http://sqlmvp.kr/221419558020
· Docker Containers : http://sqlmvp.kr/221423910065
· 레지스트리에 푸시하여 작성한 friendlyhello이미지를 게시했는지 확인한다. 이번 포스트에서는 레지스트리에 공유된 이미지를 사용한다.
· 이미지가 배포된 컨테이너가 잘 작동하는지 확인한다. 아래 명령어를 사용하여 컨테이너를 실행하고 정상적으로 브라우저에서 접속이 되어야 한다. Username, reop 위치는 각 사용자에 따라 변경하여 사용한다.
docker run -p 4000:80 username/repo:tag |
· Docker Services에서 다룬 docker-compose.yml 사본을 준비한다.
· Docker Swarm에서 다룬 내용이 선행되어야 한다. docker node ls를 실행하여 Swarm에 조인된 두 노드 모두 Ready 상태이어야 한다.
o Docker Swarm : http://sqlmvp.kr/221429654393
Introduction
Docker Swarm에서는 Docker 클러스터인 Swarm을 설정하고 컨테이너를 여러 컴퓨터에서 동시에 실행하여 응용 프로그램을 배포하는 방법을 알아보았다. 이번 포스트에서는 Stack에 대해서 살펴본다. 스택은 종속성을 공유하는 상호 연관된 서비스의 그룹이며 함께 조정(orchestrate)될 수 있다. 단일 스택은 전체 응용프로그램의 기능을 정의하고 조정할 수 있다. (매우 복잡한 응용 프로그램이 여러 스택을 사용할 수도 있음). 이전 포스트까지 다룬 내용을 보면 compose 파일을 만들고 docker stack deploy 사용하였다. 그러나 지금까지는 단일 호스트에서 실행되는 단일 서비스 스택이었다. 일반적으로 프러덕션 환경에서는 단일 스택으로 잘 사용하지 않는다. 프로덕션에서는 여러 서비스를 서로 관련시키며 여러 시스템에서 실행 할 수 있다.
Add a new service and redeploy
Docker Swarm 컨테이너를 어떻게 스케줄 하는지를 볼 수 있는 무료 시각화 도구가 있다.
1. docker-compose.yml파일을 내용을 아래 스크립트로 교체한다. usename/reop:tag 부분은 사용자 주소에 맞게 변경한다.
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet networks: webnet: |
docker-compose 파일에 새롭게 추가된 내용은 피어 서비스 web 으로 visualizer이라 불린다.(visualizer에게 Docker용 호스트 소켓 파일에 대한 액세스 권한을 부여하는Volumes 키와 placement키를 사용하여 이 서비스가 작업자가 아닌 Swarm 관리자만 실행하도록 한다.) 오픈소스 프로젝트를 기반으로 작성된 이 Docker 컨테이너는 Swarm에서 실행되는 Docker 서비스를 표시한다.
2. 쉘이 myvm1과 통신하도록 구성되었는지 확인한다.
docker-machine ls를 실행하여 머신 목록을 확인한다. 그 옆에 별표가myvm1연결되어 있는지 확인한다. 필요한 경우 docker-machine env myvm1을 다시 실행한 다음 주어진 명령을 실행하여 쉘을 구성한다.
[Mac or Linux] eval $(docker-machine env myvm1)
[Windows] & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression |
3. 관리자에게 docker stack deploy 명령을 다시 실행하고 업데이트가 필요한 서비스를 업데이트 한다.
docker stack deploy -c docker-compose.yml getstartedlab |
4. compose 파일에서 visualizer가 포트 8080으로 매핑되었기 때문에 docker-machine ls를 실행하여 노드 중 하나의 ip 주소를 가져온다. 웹브라우저에서 IP:8080 주소를 입력하면 실행중인 visualizer를 볼 수 있다.
visualizer의 단일 복사본은 예상대로 관리자가 실행중 이며 web 인스턴스 5개는 Swarm 전체에 분산되어 있다. docker stack ps <stack>을 실행하여 시각화를 확인할 수 있다.
docker stack ps getstartedlab |
visualizer는 스택에 포함된 모든 앱에서 실행할 수 있는 독립 실행형 서비스이다. 그러므로 다른서비스에 의존하지 않는다. 이제 종속성이 있는 방문자 카운터 Redis 서비스를 만들어본다.
Persist the data
앱 데이터를 저장하기 위한 Redis 데이터베이스를 추가하기 위해 아래의 새로운 docker-compose.yml 파일로 변경한다. 스크립트의 마지막 부분의 명령을 사용하여 Redis 서비스가 추가된다. Username/repo:tag를 사용자 정보로 변경한다.
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet redis: image: redis ports: - "6379:6379" volumes: - "/home/docker/data:/data" deploy: placement: constraints: [node.role == manager] command: redis-server --appendonly yes networks: - webnet networks: webnet: |
Redis는 Docker 라이브러리에 공식 이미지가 있으며 단지 redis라는 짧은 image 이름이 부여되어 있으므로 여기에 username/repo 표기법이 없다. Redis 포트 6379는 컨테이너에서 호스트로 노출되도록 Redis에 의해 사전 구성되어 있다. 여기에서 compose 파일에 호스트로부터 노출되므로 여기에서 호스트에 대한IP를 실제 입력할 수 있다. 노드를 Redis Desktop Manager로 가져와서 redis 인스턴스를 관리한다. 가장 중요한 점은 이 배포된 스택의 데이터가 유지되도록 하는 redis 사양의 몇 가지 사항이 있다.
· Redis는 항상 관리자에서 실행되므로 항상 동일한 파일 시스템을 사용한다.
· Redis는 호스트의 파일 시스템에 있는 임의의 디렉토리에 Redis가 데이터를 저장하는 컨테이너 내부의 /data로 액세스 한다.
Redis 데이터를 위한 호스트의 물리적 파일 시스템과 인증을 만든다. 이 기능이 없으면 Redis는 컨테이너의 파일 시스템 내부에 /data 데이터를 저장한다. 이 데이터는 해당 컨테이너가 재배포 되는 경우 지워진다.이 인증에는 두 가지 구성 요소가 있다.
· Redis 서비스에 배치한 배치 제약 조건으로 항상 동일한 호스트를 사용한다.
· 컨테이너가 ./data(호스트)를 /data(Redis 컨테이너 내부)로 액세스 할 수 있게 만든 볼륨, 컨테이너가 오고가는 동안에도 지정된 호스트의 ./data에 저장된 파일은 계속 유지되므로 연속성을 유지할 수 있다.
이제 새로운 Redis-Using 스택을 배포할 준비가 되었다.
2. 관리자 호스트에 ./data 디렉토리를 만든다.
docker-machine ssh myvm1 "mkdir ./data" |
3. 쉘이 myvm1과 통신하도록 구성되었는지 확인한다.
docker-machine ls를 실행하여 머신 이름 옆에 별표가 표시된 대로 myvm1 연결되어 있는지 확인한다. 필요한 경우 docker-machine env myvm1을 다시 실행한 다음 주어진 명령을 실행하여 쉘을 구성한다.
Mac or Linux eval $(docker-machine env myvm1)
Windows & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression |
4. docker stack deploy 실행을 한번 더 실행한다.
$ docker stack deploy -c docker-compose.yml getstartedlab |
4. docker service ls를 실행하여 서비스가 예상대로 실행되는지 확인한다.
docker service ls |
5. docker-machine ls명령으로 확인한 노드 중 하나의 IP를 사용하여 웹브라우저를 사용하여 접속한다. Redis에 저장된 방문자 카운터 결과를 확인할 수 있다.
또한 노드 IP 주소에서 포트8080의 visualizer를 확인하고 web 및 Visualizer 서비스와 함께 실행되는 redis 서비스를 확인한다.
Recap
이번 포스트에서 다룬 내용은 아래 동영상으로 확인할 수 있다.
· Docker Stacks : https://asciinema.org/a/113840
스택은 모든 상호 관련 서비스가 연관되어 실행된다는 것을 배웠다. 스택에 더 많은 서비스를 추가하려면 compose 파일에 서비스를 삽입하는 방법을 배웠다. 마지막으로 배치 제약 조건과 볼륨을 함께 사용하면 데이터를 영구 저장하기 위한 영구적인 홈을 생성할 수 있으므로 컨테이너의 분할 및 재배포시 앱의 데이터가 그대로 유지된다는 것을 알게 되었다.
2019-01-07 / Sungwook Kang / http://sqlmvp.kr
stack, data, persist, dependencies, redis, storage, volume, port
'SW Engineering > DevOps, SRE' 카테고리의 다른 글
Docker Command Basic (도커 기본 명령어) (0) | 2019.03.26 |
---|---|
Docker Deploy (0) | 2019.03.26 |
Docker Swarms (0) | 2019.03.26 |
Docker Services (0) | 2019.03.26 |
Build an image and run it as one container (0) | 2019.03.26 |