docker stack services 명령으로 서비스 목록을 확인하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker stack services 명령어를 효과적으로 사용하여 Docker 스택 내의 서비스를 관리하고 검사하는 방법을 배우게 됩니다. 먼저 Docker Compose 를 사용하여 간단한 Docker 스택을 설정하는 것으로 시작합니다. 여기에는 Docker Compose 를 설치하고 docker-compose.yml 파일에 정의된 기본 애플리케이션을 배포하는 작업이 포함됩니다.

스택이 실행되면 docker stack services의 핵심 기능을 탐색하여 스택의 모든 서비스를 나열합니다. 이를 기반으로 서비스 이름 및 ID 를 기준으로 필터링하여 서비스 목록을 세분화하는 방법을 배우게 됩니다. 마지막으로, 서비스 목록의 출력 형식을 사용자 정의하여 필요한 정보를 명확하고 체계적인 방식으로 표시하는 방법을 알아보겠습니다.

스택 내 모든 서비스 목록 확인

이 단계에서는 Docker 스택 내에서 실행 중인 모든 서비스를 나열하는 방법을 배우게 됩니다. 서비스를 나열하기 전에 스택이 실행 중이어야 합니다. Docker Compose 가 미리 설치되어 있지 않으므로 먼저 설치한 다음 간단한 스택을 배포합니다.

먼저 Docker Compose 를 설치해 보겠습니다. 바이너리를 다운로드하여 실행 가능하게 만듭니다.

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

이제 Docker Compose 가 설치되었으므로 스택을 정의하는 간단한 docker-compose.yml 파일을 만들어 보겠습니다. ~/project 디렉토리에 docker-compose.yml이라는 파일을 생성합니다.

nano ~/project/docker-compose.yml

다음 내용을 파일에 추가합니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: alpine:latest
    command: sleep 3600

이 파일은 nginx 이미지를 사용하는 web 서비스와 alpine 이미지를 사용하는 app 서비스, 두 개의 서비스로 구성된 스택을 정의합니다. web 서비스는 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다. app 서비스는 컨테이너를 계속 실행하기 위해 sleep 3600 명령을 실행합니다.

파일을 저장하고 편집기를 종료합니다 (nano 에서 Ctrl+X, Y, Enter).

이제 docker stack deploy를 사용하여 스택을 배포해 보겠습니다. 스택 이름을 mystack으로 지정합니다.

docker stack deploy -c ~/project/docker-compose.yml mystack

이 명령은 docker-compose.yml 파일을 읽고 파일 내에 정의된 서비스를 mystack이라는 Docker 스택으로 생성합니다. 서비스가 생성되고 있음을 나타내는 출력을 볼 수 있습니다.

스택이 배포되면 스택 이름 뒤에 docker stack services 명령을 사용하여 스택의 모든 서비스를 나열할 수 있습니다.

docker stack services mystack

이 명령은 mystack 스택의 서비스에 대한 정보를 표시하는 테이블을 표시합니다. 여기에는 ID, 이름, 모드, 복제본, 이미지 및 포트가 포함됩니다.

다음과 유사한 출력을 볼 수 있습니다.

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

출력은 mystack_appmystack_web 서비스를 나열하여 해당 서비스가 mystack 스택의 일부로 실행 중임을 확인합니다.

이름으로 서비스 필터링

이 단계에서는 Docker 스택에서 서비스 이름을 기반으로 서비스 목록을 필터링하는 방법을 배우게 됩니다. 스택에 많은 서비스가 있고 특정 서비스에 대한 정보만 보려는 경우 유용합니다.

docker stack services 명령은 출력을 필터링하기 위한 기준을 지정할 수 있는 --filter 플래그를 지원합니다. 서비스 이름으로 필터링하려면 name 필터를 사용할 수 있습니다.

이름으로 필터링하는 구문은 --filter name=<service_name>입니다. 스택의 서비스 이름은 일반적으로 스택 이름으로 시작하고 밑줄과 docker-compose.yml 파일에 정의된 서비스 이름이 뒤따릅니다 (예: mystack_web).

mystack 스택의 서비스를 필터링하여 web 서비스만 표시해 보겠습니다.

docker stack services mystack --filter name=mystack_web

이 명령은 mystack_web 서비스에 해당하는 행만 표시합니다.

다음과 유사한 출력을 볼 수 있습니다.

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

mystack_web 서비스에 대한 정보만 표시되는 것을 확인할 수 있습니다.

마찬가지로, app 서비스만 표시하도록 필터링할 수 있습니다.

docker stack services mystack --filter name=mystack_app

그러면 mystack_app 서비스에 대한 정보가 표시됩니다.

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

name 필터를 사용하면 대규모 스택 내에서 특정 서비스에 대한 세부 정보를 빠르게 찾고 볼 수 있습니다.

ID 로 서비스 필터링

이 단계에서는 Docker 스택에서 고유 ID 를 기반으로 서비스 목록을 필터링하는 방법을 배우게 됩니다. 이름으로 필터링하는 것이 더 직관적일 수 있지만, ID 로 필터링하는 것은 정확성이 절대적으로 필요하거나 유사한 이름을 가진 서비스를 처리해야 할 때 유용합니다.

Docker 스택의 각 서비스에는 고유 ID 가 할당됩니다. 이러한 ID 는 docker stack services의 출력 첫 번째 열에서 확인할 수 있습니다.

서비스 ID 로 필터링하려면 id 필터와 함께 --filter 플래그를 사용합니다. 구문은 --filter id=<service_id>입니다. 서비스를 고유하게 식별하기 위해 ID 의 충분한 접두사만 제공하면 됩니다.

먼저, ID 를 얻기 위해 모든 서비스를 다시 나열해 보겠습니다.

docker stack services mystack

출력을 보고 mystack_webmystack_app 서비스의 ID 를 식별합니다. ID 는 16 진수 문자의 문자열입니다. 예를 들어, 출력은 다음과 같을 수 있습니다 (ID 는 다를 것입니다).

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

mystack_web의 ID 가 yyyyyyyyyyyy로 시작한다고 가정해 보겠습니다. 이 ID (또는 더 짧은 고유 접두사) 로 다음과 같이 필터링할 수 있습니다.

docker stack services mystack --filter id=yyyyyyyyyyyy

yyyyyyyyyyyymystack_web 서비스의 실제 ID 시작 부분으로 바꿉니다.

이 명령은 일치하는 ID 를 가진 서비스에 대한 행만 표시합니다.

다음과 유사한 출력을 볼 수 있으며, mystack_web 서비스만 표시됩니다.

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

마찬가지로, mystack_app 서비스의 ID 로 필터링할 수 있습니다. docker stack services mystack 출력에서 ID 를 찾아서 필터에 사용합니다. 예를 들어, ID 가 xxxxxxxxxxxx로 시작하는 경우:

docker stack services mystack --filter id=xxxxxxxxxxxx

xxxxxxxxxxxxmystack_app 서비스의 실제 ID 시작 부분으로 바꿉니다.

그러면 mystack_app 서비스에 대한 정보가 표시됩니다.

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

ID 로 필터링하면 특히 자동화된 스크립트에서 또는 유사한 이름을 가진 서비스를 처리할 때 특정 서비스를 대상으로 하는 정확한 방법을 제공합니다.

서비스 목록 출력 형식 지정

이 단계에서는 docker stack services 명령의 출력을 형식 지정하는 방법을 배우게 됩니다. 기본적으로 출력은 사람이 읽기 쉬운 테이블 형식으로 표시됩니다. 그러나 --format 플래그를 사용하여 출력을 사용자 정의할 수 있으며, 이는 스크립팅에 특히 유용하거나 다른 형식으로 특정 정보가 필요한 경우에 유용합니다.

--format 플래그는 Go 템플릿 문자열을 허용합니다. 이를 통해 표시할 필드와 형식을 정확하게 지정할 수 있습니다. 표시하려는 일반적인 필드에는 .ID, .Name, .Image, .Mode, .Replicas, .Ports가 있습니다.

출력을 형식 지정하여 탭으로 구분된 서비스 ID, 이름 및 이미지만 표시해 보겠습니다.

docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"

이 명령에서:

  • {{.ID}}, {{.Name}}, {{.Image}}는 각 서비스에 대한 해당 값으로 대체될 Go 템플릿 자리 표시자입니다.
  • \t는 여기에서 구분 기호로 사용되는 탭 문자를 나타냅니다.

이제 출력은 탭으로 구분된 ID, 이름 및 이미지가 포함된 각 줄이 있는 서비스 목록이 됩니다.

xxxxxxxxxxxx mystack_app alpine:latest
yyyyyyyyyyyy mystack_web nginx:latest

(ID 는 환경에 따라 다릅니다.)

일부 경우에 더 쉽게 구문 분석할 수 있는 목록으로 출력을 형식 지정할 수도 있습니다. 예를 들어 서비스 이름과 복제본 수를 나열하려면:

docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"

그러면 다음과 같이 출력됩니다.

- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)

--format 플래그는 docker stack services의 출력을 특정 요구 사항에 맞게 조정하는 강력한 방법을 제공하여 다른 도구나 스크립트와 더 쉽게 통합할 수 있도록 합니다.

마지막으로, 배포된 스택을 제거하여 정리해 보겠습니다.

docker stack rm mystack

이 명령은 mystack 스택과 관련된 모든 서비스 및 네트워크를 제거합니다. 스택이 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

요약

이 랩에서는 docker stack services 명령을 사용하여 Docker 스택 내의 서비스를 나열하는 방법을 배웠습니다. 여기에는 먼저 Docker Compose 를 설치하고 docker-compose.yml 파일에 정의된 간단한 스택을 배포하는 작업이 포함되었습니다. 그런 다음 docker stack services <stack_name>을 사용하여 배포된 스택의 모든 서비스 테이블을 표시했습니다.

또한 이 랩에서는 이름 및 ID 로 서비스를 필터링하여 목록을 특정 서비스로 좁히는 방법을 다루었습니다. 마지막으로, 표시된 정보를 사용자 정의하기 위해 docker stack services 명령의 출력을 형식 지정하는 방법을 살펴보았습니다.