SW Engineering/DevOps, SRE

Docker Stack

SungWookKang 2019. 3. 26. 03:31
반응형

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

http://localhost:4000

 

·         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

 

 

stackdatapersistdependenciesredisstoragevolumeport

반응형

'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