11 Services with Docker and Compose

2024. 4. 7. 10:22Docker

이 챕터에서는 다음을 다룹니다:

  • 서비스의 이해 및 컨테이너들과의 관계
  • Docker Swarm을 사용한 기본 서비스 관리
  • Docker Compose 와 YAML을 사용하여 선언전 환경 구축
  • Compose 와 deploy 커맨드를 사용한 프로젝트 반복
  • 서비스 스케일링 및 cleaning up

오늘날 우리가 사용하는 대부분의 소프트웨어는 휴먼 사용자와 상호작용하도록 설계된 것이 아니라, 다른 프로그램과 상호작용하도록 설계되었습니다. 이러한 상호의존적인 프로세스들의 네트워크는 결제 처리, 게임 실행, 글로벌 커뮤니케이션 지원, 콘텐츠 전달과 같은 공동의 목적을 수행합니다. 이 네트워크를 자세히 살펴보면, 컨테이너에서 실행 중일 수 있는 개별 실행 프로세스를 발견할 수 있습니다. 이 프로세스들은 메모리를 할당받고 CPU에서 실행 시간을 부여받습니다. 네트워크에 연결되고, 특정 포트에서 다른 프로그램의 요청을 대기합니다. 이들의 네트워크 인터페이스와 포트는 네트워크에서 발견 가능하도록 네임 시스템에 등록됩니다.

그러나 시야를 넓혀 더 많은 프로세스를 살펴보면, 대부분의 프로세스들이 공통된 특성과 목표를 공유하고 있음을 알 수 있습니다.

네트워크를 통해 발견 가능(discoverable)하고 사용 가능(available)해야 하는 모든 프로세스, 기능, 또는 데이터를 서비스(service)라고 합니다.
서비스라는 이름은 하나의 추상화(abstraction)입니다. 이러한 목표를 추상적 용어로 표현함으로써, 이 패턴을 사용하는 것들에 대해 논의하는 방식을 단순화할 수 있습니다.

특정 서비스를 언급할 때, 해당 이름이 DNS 또는 환경에 적합한 서비스 검색 메커니즘을 통해 발견 가능해야 한다는 점을 명시적으로 언급할 필요가 없습니다.
클라이언트가 특정 서비스를 필요로 할 때 해당 서비스가 실행 중이어야 한다는 점도 따로 언급할 필요가 없습니다.
이러한 기대 사항은 서비스 추상화에 대한 공통 이해를 통해 이미 전달되었습니다. 추상화를 통해 특정 서비스를 특별하게 만드는 것들에 초점을 맞출 수 있습니다.

이와 같은 이점을 우리의 도구에도 반영할 수 있습니다. Docker는 이미 컨테이너에 대해 이러한 작업을 수행합니다.
컨테이너는 6장에서 특정 Linux 네임스페이스, 특정 파일 시스템 뷰, 자원 할당(resource allotments)을 사용하여 시작된 프로세스로 설명되었습니다.
우리는 컨테이너에 대해 이야기할 때마다 이러한 세부 사항을 설명할 필요가 없으며, 직접 네임스페이스를 생성할 필요도 없습니다. Docker가 우리를 위해 이를 대신 처리합니다.

Docker는 서비스(service)를 포함하여 다른 추상화를 위한 도구도 제공합니다.
이 장에서는 swarm 모드에서 서비스를 다룰 수 있도록 Docker가 제공하는 기본 도구를 소개합니다.
서비스 수명 주기, 오케스트레이터(orchestrator)의 역할, 그리고 이 오케스트레이터와 상호작용하여 서비스를 배포하고 관리하는 방법을 다룹니다. 이 장에서 설명된 도구는 책의 나머지 부분에서도 계속 사용될 것입니다.
동일한 개념, 문제, 기본 도구는 Kubernetes를 포함한 모든 컨테이너 오케스트레이션 시스템에서도 제공됩니다.
이후에 나올 내용은 여러분이 일상 업무에서 사용하는 오케스트레이터를 이해하는 데에도 도움이 될 것입니다.

 

11.1 A service “Hello World!”

서비스를 시작하는 것은 컨테이너를 시작하는 것만큼 간단합니다.
예를 들어, 다음 두 커맨드를 실행하면 로컬에서 "Hello World!" 웹 서버를 시작할 수 있습니다:

$ docker swarm init    <--- Enables the service abstraction
$ docker service create \  <--- Starts the server on localhost:8080
> --publish 8080:80 \
> --name hello-world \
> dockerinaction/ch11_service_hw:v1

 

컨테이너와 달리, Docker 서비스는 swarm 모드에서만 사용할 수 있습니다.
swarm 모드를 초기화하면 내부 데이터베이스가 시작되고, Docker 엔진에서 서비스 오케스트레이션을 수행하는 장시간 실행 루프(long-running loop)가 시작됩니다. (그림 11.1 참조)

Swarm은 이외에도 여러 기능을 제공하며, 책의 나머지 부분에서 이를 다룰 것입니다.

Figure 11.1 Initializing a swarm node

 

이전 코드에서 init 커맨드를 실행하면 서비스 관리를 위한 하위 커맨드(subcommands)가 활성화됩니다.

service create 하위 커맨드는 다음과 같은 서비스를 정의합니다:

  • 이름: hello-world
  • 포트: 8080에서 사용 가능
  • 이미지: dockerinaction/ch11_service_hw:v1
    (그림 11.2 참조)

Figure 11.2 Creating your first service

 

이 두 커맨드를 실행한 후에는 서비스의 상태를 보여주는 진행 바(progress bar)가 나타납니다.
진행이 완료되면 상태가 Running으로 표시되고, 커맨드가 종료됩니다.

이 시점에서 http://localhost:8080에 접속하면,
Hello, World! --ServiceV1라는 메시지와 함께 요청을 처리한 작업 ID(컨테이너 ID)가 표시됩니다.


Task이란?

Task은 Swarm에서 작업 단위를 나타내는 개념입니다.

  • 각 task에는 하나의 컨테이너가 연관되어 있습니다.
  • 컨테이너를 사용하지 않는 다른 종류의 task도 있을 수 있지만, 이 장에서는 다루지 않습니다.

Swarm은 Task만으로 작동하며,
기본 구성 요소가 task 정의를 컨테이너로 변환합니다.
이 책은 Docker의 내부 구조에 대해 다루지 않으므로,
이 장에서는 TaskContainer를 대략적으로 동일한 개념으로 간주해도 됩니다.

 

Figure 11.3 The swarm node automatically creates a container to run the service software.

 

이 과정은 비슷한 컨테이너 예제를 실행하는 것과 유사하게 느껴질 것입니다.
하지만 서비스와 컨테이너의 유사점보다는 차이점에 초점을 맞추는 것이 더 유익합니다.

먼저, 서비스 task는 컨테이너로 구현된다는 점을 이해해야 합니다.
서비스가 실행 중일 때 docker container ps 명령을 실행하면,
hello-world.1.pqamgg6bl5eh6p8j4fj503kur와 같은 이름을 가진 컨테이너가 실행 중인 것을 확인할 수 있습니다.

이 컨테이너 자체는 특별한 점이 없습니다.
컨테이너를 검사해도 특별히 흥미로운 결과를 얻을 수는 없습니다.
다만 몇 가지 Swarm 전용 라벨을 발견할 수 있을 뿐입니다.

하지만 이 컨테이너를 삭제하면 흥미로운 일이 발생합니다.
이 섹션에서는 Swarm이 서비스 수명 주기를 어떻게 관리하고,
서비스 복원(service resurrection)과 같은 자동화된 고급 기능을 수행하는지를 설명합니다.

 

11.1.1 Automated resurrection and replication

 

 

 

'Docker' 카테고리의 다른 글

Dangling images  (0) 2024.11.17
Docker Redis  (0) 2024.04.07
10 Image pipelines  (0) 2024.04.07
9 Public and privatesoftware distribution  (0) 2024.04.07
8 Building images automatically with Dockerfiles  (0) 2024.04.04