Part 3 : Services

사전준비

  • Docker 1.13 버전 이상 설치
  • Docker Compose 설치. 만약 Docker for Mac 또는 Docker for Windows를 설치할 경우에는 포함되어있습니다. 만약 Linux 시스템일 경우에는 직접 설치해야합니다. 만약 Windows 10이지만 Hyper-V가 없는 경우에는 Docker Toolbox를 활용하시기 바랍니다.

  • Part 1 읽어보기

  • Part 2 를 읽고 Container 생성하는 방법 학습하기

  • 이전 장에서 만든 friendlyhello 이미지를 Image 공유부분을 참고해서 배포하기

  • 배포한 Container에서 정상적으로 이미지가 수행되는지 확인합니다. Image 배포 위치에 맞게 username, repo, tag를 사용해서 다음 명령으로 실행합니다. docker run -p 80:80 username/repo:tag 실행이 완료되면 http://localhost/로 확인합니다.

소개

3장에서는 어플리케이션을 좀더 확장해서 Load-Balancing이 가능하도록 해보겠습니다. 이것을 위해서는 분산 어플리케이션 계층을 Service로 한단계 더 올리겠습니다.

  • Stack
  • Service (이번장에서 다룰 내용입니다)
  • Container (Part 2)

Service에 대하여

분산 어플리케이션에서 각각의 어플리케이션을 Service라고 부릅니다. 예로, Video 공유 시스템을 가정했을 때 데이터베이스에 데이터를 저장하는 어플리케이션, 사용자가 업로드한 뒤 백그라운드에서 비디오를 변환할 서비스, 앞단에 보여질 서비스 등등이 있을 것 입니다.

Service는 운영속 Container라고 생각하시면 됩니다. Service는 단순 1개의 이미지를 수행하는 것이 아니라 어떤 포트를 사용하고, 서비스의 사용량에 따라 몇개의 Container를 사용할지 등등에 대한 이미지를 어떻게 실행할지 구성하는 것 입니다. 서비스를 확장하는 것은 컨테이너 인스턴스의 개수를 증가시킴에 따라 서비스에 더 많은 컴퓨팅 리소스를 할당할 수 있는것 입니다.

Docker 플랫폼에서는 서비스에 대하여 정의하고 실행하고 확장하는 것이 매우 쉽습니다. 단순히 docker-compose.yml 파일만 작성하시면 됩니다.

첫번째 docker-compose.yml 파일

docker-compose.yml 파일은 YAML 형식으로 Docker Container가 운영환경에서 어떻게 동작하는지 정의합니다.\

docker-compose.yml

docker-compose.yml 파일을 원하는 위치에 저장합니다. Part 2에서 만든 이미지를 Registry에 배포가 잘 되었는지 확인합니다. 그리고 아래 파일 내용중 username/repo:tag 부분을 본인에 맞게 수정합니다.

version: "3"
services:
  web:
    # username/repo:tag 부분을 본인이 배포한 이미지 정보에 맞게 수정합니다.
    image: username/repo:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
networks:
  webnet:

docker-compose.yml 파일은 다음과 같은 내용입니다.

  • Part 2에서 생성하여 Registry에 올린 Image를 Pull 받는다.
  • web이라고 불리는 서비스로 5개의 Container를 실행하며 최대 CPU를 10%(모든 코어에 대하여), RAM을 50M를 사용하도록 한다.
  • 만약 실패가 발생하면 Container를 즉시 재시작 한다.
  • web의 80포트를 Host 시스템 80포트에 연결한다.
  • web 서비스의 모든 Container는 webnet이라고 불리는 부하분산 네트워크에서 80포트를 공유합니다. (내부적으로는 Container의 임시적인 포트가 web의 80포트에 연결됩니다)
  • webnet 네트워크는 기본설정(부하분산 네트워크)으로 구성됩니다.

새로운 부하분산 어플리케이션 실행

docker stack deploy 명령을 하기전에 다음을 실행합니다.

docker swarm init

Note : 위 명령에 대한 내용은 Part 4에서 자세히 다루겠습니다. docker swarm init 명령을 하지 않으면 "this node is not a swarm manager" 라는 오류 메시지를 보실 수 있습니다.

이제 실행해보겠습니다. 여기서는 어플리케이션 이름을 getstartedlab 으로 진행을 할 것 입니다. 각자에 맞게 사용하시면 됩니다.

docker stack deploy -c docker-compose.yml getstartedlab

우리의 단일 Service Stack이 5개의 Container 인스턴스로 배포되어 동작할 것 입니다. 자세히 살펴보겠습니다.

어플리케이션에 대한 Service ID를 확인해보겠습니다.

docker service ls

어플리케이션의 이름으로 시작하는 web Service를 볼 수 있을 것 입니다. 만약 예제와 동일하게 진행했다면 getstartedlab_web 이라는 이름일 것 입니다. Service ID와 함께 복제본의 개수, 이미지 이름, 노출되는 포트 를 확인할 수 있습니다.

Service 하나에 동작하는 Container를 task라고 부릅니다. Task는 docker-compose.yml에 정의한 replicas 수치 만큼의 숫자로 구성된 ID를 가지게 됩니다. 해당 서비스에 대한 task를 조회하려면 다음 명령어를 사용하시면 됩니다.

docker service ps getstartedlab_web

Task는 또한 시스템의 Container 목록에도 함께 표시됩니다. 다만, Service 별로 필터되지는 않습니다.

docker container ls -q

터미널에서 curl -4 http://localhost 명령을 여러번 호출하거나, 브라우저에서 http://localhost 주소를 계속적으로 갱신해보시기 바랍니다.

결과를 보시면 Hostname에 표시되는 Container ID가 변경되는 것을 보실 수 있습니다. 매 요청마다 Round-robin 방식으로 5개의 Task가 선택되어 응답하도록 Load-balancing이 수행됨을 볼 수 있습니다. Container ID는 이전에 수행한 명령에 표시되는 것과 일치할 것 입니다.(docker container ls -q)

results matching ""

    No results matching ""