Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[DevOps/Docker] 멀티호스트 환경에서 컨테이너 관리 본문

DevOps/Docker

[DevOps/Docker] 멀티호스트 환경에서 컨테이너 관리

scii 2020. 12. 6. 01:05

Docker에서 작동하는 웹 애플리케이션을 제품 환경에서 운용할 때는 애플리케이션이 사양대로 올바르게 작동할 뿐만 아니라 서비스 이용자가 항상 이용할 수 있도록 운용 관리를 해야 한다. 이러한 컨테이너 기반은 보통 멀티호스트 환경으로 구축한다.

멀티호스트 환경에서 컨테이너 관리의 개요

웹 시스템의 실행 환경은 웹 서버, 프록시 서버, 데이터 스토어 등 역할이 다른 여러 개의 서버 기능이 연계되어 작동한다. 제품 환경에서 이용자에게 서비스를 제공할 때는 여러 개의 물리 서버나 여러 개의 가상 머신(VM)으로 구성된 멀티호스트 환경으로 서비스를 제공하는 것이 일반적이다.


멀티호스트 환경과 클러스터링

하나의 호스트 머신에서 Docker를 설치하고 그 위에서 몇 개의 컨테이너를 가동시켜 서버를 작동시켰다고 가정해보자. 이미지의 작성이나 컨테이너의 시작 등은 호스트 머신에 설치된 Docker가 수행하고, 여러 개의 Docker를 일원 관리할 때는 Docker Compose를 사용하여 애플리케이션의 실행 환경을 구축했다면 이 호스트에서 장애 발생 시, 서비스는 정지된다.

대규모 웹 시스템에서 서비스 정지는 단순한 비즈니스 기회의 상실뿐만 아니라 기업의 사회적 신용을 잃게 할 우려가 있다. 그래서 만일에 시스템의 일부에서 장애가 발생해도 서비스가 정지되지 않도록 만드는 장치가 필요하다.

이를 구현하는 기술 중 하나로 클러스터링이 있다.

클러스터링이란?

여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술을 말한다.

일반적으로 클러스터링을 하면 다음 두 가지 시스템 특성이 향상된다.

가용성 (Availability)

시스템에 있어서 가용성이란 시스템이 계속해서 가동될 수 있는 능력을 말한다. 서버의 오류나 하드웨어의 고장 등이 발생해도 다른 정상적인 서버나 하드웨어가 대신해서 처리를 계속함으로써 높은 신뢰성을 얻을 수 있다.

확장성 (Scalability)

고부하로 인한 시스템 다운을 피하기 위해 여러 대의 컴퓨터를 클러스터화하여 처리를 분산시킴으로써 높은 처리 성능을 얻을 수 있다. 클라우드의 가상 머신의 경우는 오토스케일 기능이 제공되는 경우도 있다.

Docker를 사용하면 단일 호스트 머신에서뿐만 아니라 여러 대의 호스트 머신 상에서 Docker를 작동시켜서 높은 가용성과 확장성을 가진 애플리케이션 실행 환경을 구축할 수 있다. 이와 같이 멀티호스트 환경에서 컨테이너들의 클러스터링을 수행하기 위한 툴을 "컨테이너 오케스트레이션 툴" 이라고 한다.

또한 멀티호스트 환경에서 컨테이너를 작동시키는 경우는 컨테이너의 장애나 호스트 머신의 가동 상황 등을 감시하는 장치를 생각해 둘 필요가 있다. 컨테이너 실행 환경을 지원하는 통합 감시 툴이나 클라우드에 의한 감시 서비스 등이 Docker를 지원하고 있으므로 이것들을 이용하는 것이 좋다.


Docker Machine 이란?

Docker Machine은 호스트 머신/클라우드/가상 환경 등에 docker의 실행 환경을 만들 수 있는 command-line tool 이다.

Docker Machine 도큐먼트

docs.docker.com/machine/

 

Docker Machine overview

 

docs.docker.com

Docker Machine GitHub

github.com/docker/machine

 

docker/machine

Machine management for a container-centric world. Contribute to docker/machine development by creating an account on GitHub.

github.com

Docker Machine 설치 방법

docs.docker.com/machine/install-machine/

 

Install Docker Machine

 

docs.docker.com

Docker Machine이 지원하고 있는 주요 환경은 다음과 같다.

  • Amazon Web Services
  • Microsoft Azure
  • Digital Ocean
  • Exoscale
  • Google Compute Engine
  • Microsoft Hyper-V
  • OpenStack
  • Rackspace
  • IBM SoftLayer
  • Oracle VirtualBox
  • VMWare
Docker Machine을 사용하면 어디에서든 명령 하나로 Docker의 실행 환경을 구축할 수 있다.

웹 애플리케이션 서비스 공개해 보기

웹 애플리케이션을 퍼블릭 클라우드인 Google Cloud Platform (GCP) 의 가상 머신 Google Compute Engine (GCE) 을 사용하여 인터넷상에 서비스를 공개해보자. 서비스를 공개하기 위한 Docker의 실행 환경은 Docker Machine을 사용하여 구축하므로 Docker Machine에서 어떤 일을 할 수 있는지, 그 개요를 살펴보자.

Docker 실행 환경을 만들려면 docker-machine create 명령을 사용한다.

Docker 실행 환경 작성

docker-machine을 사용하여 클라우드 서비스인 GCP의 가상 머신 기능을 제공하는 GCE에 docker 실행 환경을 만들 것이다. 그러므로 Google Cloud Platform 계정을 미리 취득하고, GCP 프로젝트를 작성해 놓아야 한다.

Google Compute Engine을 이용하려면 API의 사용을 허가 해야 한다. 브라우저에서 GCP의 웹 콘솔에 로그인 후, [API 및 서비스] -> [라이브러리] 를 선택한다. 'Google Compute Engine API' 의 액세스 권한 설정 화면이 표시되면 [사용 설정] 버튼을 클릭한다. 또한 PC에 미리 Google Cloud SDK를 설치해야 한다.

cloud.google.com/sdk/docs/install

 

Google Cloud SDK 설치  |  Cloud SDK 문서

이 페이지에는 Cloud SDK 설치를 선택하고 유지하기 위한 안내가 포함되어 있습니다. 설치 안내 참고: 프록시/방화벽을 사용하는 경우 자세한 설치 방법은 프록시 설정 페이지를 참조하세요. Linux C

cloud.google.com

다음의 명령은 'docker-scii' 라는 이름의 GCP 프로젝트를 설정하고, GCP 프로젝트명을 환경변수 PROJECT_ID에 설정하는 예이다. 이 GCP 프로젝트명은 환경에 따라 달라지며 이미 존재하고 있는 이름(ID)이므로 반드시 임의의 다른 이름으로 바꿔야 한다.

// GCP 프로젝트 설정

$ gcloud config set project docker-scii
$ PROJECT_ID=$(gcloud config list project --format "value(core.project)")

$ echo ${PROJECT_ID}
docker-scii

다음의 docker-machine 명령을 실행하면 'gcp-host' 라는 이름의 GCE 인스턴스가 시작된다.

// GCE에서 실행 환경 작성

docker-machine create --driver google \
 --google-project ${PROJECT_ID} \
 --google-zone asia-northeast1-a \
 --google-machine-type f1-micro \
 --google-tags 'http-server' \
 --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \
 gcp-host    

만약 "Error with pre-create check: google: could not find default credentions..." 라는 에러가 발생한다면 아래의 링크에서 해결하면 된다.

cloud.google.com/docs/authentication/production#linux-or-macos

 

서비스 계정으로 인증  |  Google Cloud

이 주제에서는 서비스 계정으로 애플리케이션을 인증하는 방법을 설명합니다. 일반적인 인증 시나리오 및 전략을 포함하여 Google Cloud API 인증에 대한 일반적인 정보는 인증 개요를 참조하세요.

cloud.google.com

GCP 관련 옵션

  • --driver 옵션 : GCE 상에 실행 환경을 구축하므로 드라이버에 'google' 이라는 값을 지정한다.
  • --google-project 옵션 : GCP에서는 프로젝트라는 단위로 리소스를 관리한다. docker 실행 환경을 구축하는 프로젝트를 지정한다. 여기서는 환변변수 PROJECT_ID 에서 설정한 프로젝트명을 사용하고 있다.
  • --google-zone 옵션 : 인스턴스를 생성할 리전(region)을 지정한다. 예를 들어 한국의 경우는 'asia-northeast1-a' 를 지정한다. 이 명령 옵션을 지정하지 않는 경우 미국 중부인 'us-central1-a' 로 인스턴스가 생성된다. 
  • --google-machine-type 옵션 : GCE 인스턴스의 머신 타입을 지정한다. 머신 타입에 따라 가상 CPU나 메모리 크기, 시간당 요금이 달라진다. 
  • --google-tags 옵션 : GCE 인스턴스에 설정할 태그를 지정한다. 여러 개 설정할 때는 콤마로 구분한다. 인스턴스에 대해 외부에서 HTTP(80번 포트)를 열기 위해 'http-server' 태그를 지정해야 한다.
  • --google-machine-image 옵션 : GCE 인스턴스의 머신 이미지를 지정한다. 지정할 수 있는 이미지는 공식 사이트에서 확인할 수 있다.

그 외에도 시작할 GCE 인스턴스의 디스크 크기나 IP 주소 등을 지정할 수 있는 옵션이 있다. docker-machine 명령의 옵션에 대한 자세한 내용은 아래를 참조하면 된다.

docs.docker.com/machine/drivers/gce/

 

Google Compute Engine

 

docs.docker.com


Docker 실행 환경 확인

GCE 인스턴스의 시작에는 몇 분 정도 시간이 걸린다. GCE 상에 작성한 Docker 실행 환경의 상태를 확인할 때는 다음의 명령을 실행한다.

// docker 실행 환경 확인

$ docker-machine ls

NAME       ACTIVE   DRIVER   STATE     URL                       SWARM   DOCKER      ERRORS
gcp-host   -        google   Running   tcp://12.34.56.789:1234           v19.03.14   

명령의 실행 결과를 보면 'gcp-host' 의 상태가 'Running' 으로 되어 있으므로 올바르게 가동되고 있다는 것을 알 수 있다. 


웹 애플리케이션 전개

GCE상에 Dodkcer 실행 환경이 마련되었으므로 웹 애플리케이션을 전개한다.

먼저 다음과 같은 명령을 실행하여 작성한 'gcp-host' 라는 이름의 GCE 인스턴스에 SSH로 액세스한다.

// GCE상의 실행 환경에 대한 액세스

$ docker-machine ssh gcp-host

Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.15.0-1088-gcp x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

4 packages can be updated.
0 updates are security updates.
...

로컬에서 SSH로 연결하고 있기 때문에 프롬프트가 'docker-user@gcp-host:~' 로 바뀐다. 이 GCE의 인스턴스에 애플리케이션을 전개한다. Docker Hub에서 샘플 애플리케이션이 작동하는 Docker 이미지를 취득하고 컨테이너를 시작한다.

다음의 예에서는 Docker Hub에 있는 nginx라는 이름의 이미지를 다운로드하고 'webserver' 라는 이름의 컨테이너를 시작한다.

// 컨테이너 시작

$ sudo docker container run --name webserver -it -p 80:80 nginx

웹 서버가 시작되면 브라우저에서 GCE 인스턴스에 액세스한다. 애플리케이션을 정지시킬 때는 ctrl + c 를 누른다. 또한 SSH로 연결한 GCE의 가상 머신에서 연결을 해제할 때는 exit 명령을 실행한다.


Docker 실행 환경 삭제

작성한 Docker 실행 환경을 삭제하려면 docker-machine rm 명령을 사용한다. 예를 들어 작성한 gcp-host 라는 이름의 환경을 삭제할 때는 로컬 머신에서 다음의 명령을 실행한다.

$ docker-machine rm gcp-host

docker-machine으로 GCE에 docker 실행 환경을 구축했지만, digital ocean이나 vmware와 같은 다른 환경에 구축할 때도 이 docker-machine 명령을 사용하여 구축할 수 있다. 다른 환경의 경우는 지정할 수 있는 옵션이 다르므로 자세한 방법은 공식 사이트를 참조해야 한다.

또한 Amazon Web Services 및 Microsoft Azure를 사용할 때는 'Docker Cloud'가 제공된다.

Comments