도커 컨테이너를 이용하여 app만들기 : Link

어플리케이션 확장, 로드 밸런싱

서비스 확장이란?

분산형 어플리케이션에의 각기 다른 app의 조각들을 service라고 부른다. 예시로 어떠한 비디오 공유 사이트를 만든다고 가정했을 때, 비디오 데이터를 저장하는 서비스, 비디오 업로드 서비스, 프론트엔드 서비스, 회원 서비스 등등을 말합니다.

서비스는 오직 한개의 이미지를 실행시키지만 이미지를 실행하는 방식(사용해야 할 포트 수, 실행해야 할 컨테이너의 복제본 수, 서비스에 필요한 용량 등)을 체계화합니다. DB 컨테이너를 실행시킬 때도 옵션을 넣고, 회원 서비스를 실행시킬 때도 옵션.. 옵션… 옵션… 또한 이 과정에서도 순서를 지켜야 한다. DB컨테이너 먼저 생성하고, 그다음에는 admin, ~~~ . 이러한 과정들을 일일히 다 기억하고 손으로 직접 타이핑하면서 컨테이너들을 배포해야한다. 또 컨테이너는 하나만 있으면 충분한가??? 이런 작업들은 계속 반복된다.

우리는 docker-compose.yml 을 정의함으로 이러한 서비스 확장과 로드밸런싱까지 쉽게 할수있다.

Docker-Compose 설치하기

아래의 명령어를 실행시켜 docker-compose를 다운받습니다.

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

실행 권한 주기

sudo chmod +x /usr/local/bin/docker-compose

설치가 되었는지 확인

docker-compose --version

docker-compose.yml

docker-compose.yml 파일은 프로덕션 환경에서 해당 컨테이너가 어떻게 행동해야하는지를 정의하는 파일입니다.

지난번에 작성했던 곳에 저는 작성하도록 하겠습니다.

파일의 이름은 docker-compose.yml로 만들어야합니다.

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag #전에 포스트에서 만들었던 이미지
    deploy:
      replicas: 5 # 인스턴스 5개 실행
      resources:
        limits:
          cpus: "0.1" # cpu사용을 10%로 제한
          memory: 50M # 메모리를 50M로 제한
      restart_policy: 
        condition: on-failure #실행에 실패했을 때 즉각적으로 재실행
    ports:
      - "4000:80" #포트 매핑
    networks:
      - webnet #webnet이라는 이름을 로드밸런싱 네트워크를 통해 포트 80을 공유하도록 웹 컨테이너에 지시

# webnet이라는 이름으로 네트워크 정의
networks:
  webnet:

새롭게 로드밸런싱된 app실행

docker swarm init

이 명령어는 뒤의 포스트에서 다루도록 하겠습니다. 필요하다니 일단 실행합니다.

이제 실행시키기 위해 다음의 명령어를 입력하여 줍니다. 마지막부분에 getstartedlab는 app의 이름을 지어준것입니다.

docker stack deploy -c docker-compose.yml getstartedlab

이제 우리는 우리의 로컬에 5개의 컨테이너 인스턴스를 실행했습니다. 실행된 서비스를 보도록 하겠습니다. ID, Name, Mode, Replicas, Image, Ports등 docker-compose에 정의한 내용들을 확인할 수 있습니다.

docker service ls

서비스에서 실행되고 있는 하나의 컨테이너는 task라고 불립니다. docker-compose.yml에 정의된 복제본 수만큼 테스크에는 유니크한 ID가 주어지게 됩니다. 각각은 다음의 명령어를 통해 확인합니다..

sudo docker service ps getstartedlab_web

이제 브라우저를 통해서 실제로 배포가 된 상태인지 확인을 해봅니다.

ip주소:4000에 접속하게 되면 로드밸런싱은 라운드로빈 방식으로 동작하여 컨테이너에 연결시켜주고 이 요청에 응답을 내려주게 됩니다.

app 확장하기

위의 docker-compose.yml의 replicas 값을 변경시켜 확장시킵니다.

저는 replicas의 값을 5에서 6으로 바꾸었고 다음 명령어를 다시 실행시켜 해당 서비스를 업데이트하였습니다.

docker service scale getstartedlab_web=6

App과 Swarm 내리기

app 다운시키기

docker stack rm getstartedlab

Swarm 다운

docker swarm leave --force

마치며

  • docker-compose.yml파일에 어플리케이션을 정의함으로써 간단하게 앱 확장과 로드밸런싱 할수 있다.
  • 작성한 app을 도커를 이용하여 올리고(서비스로 전환) 확장하는건 간단하다.
  • 다음 포스트에서는 다수의 컴퓨터에서 작동중인 클러스터에 어플리케이션을 배포하는 법을 알아보도록 하겠습니다.