소개
이 랩에서는 docker service logs 명령어를 효과적으로 사용하여 Docker 서비스와 개별 작업에서 생성된 로그를 보고 관리하는 방법을 배우게 됩니다. 먼저 alpine 이미지와 ping 명령어를 사용하여 간단한 Docker 서비스를 생성하는 것으로 시작합니다.
서비스를 생성한 후에는 전체 서비스에 대한 로그를 보는 방법을 탐색하여 실행 중인 모든 작업의 출력을 통합적으로 볼 수 있습니다. 그런 다음 서비스 내의 특정 작업에 대한 로그를 보는 데 집중하는 방법을 배우게 됩니다. 마지막으로, 이 랩에서는 docker service logs 명령어를 사용하여 필요에 따라 로그 출력을 필터링하고 형식화하는 다양한 옵션을 활용하는 방법을 보여줍니다.
간단한 Docker 서비스 생성
이 단계에서는 docker service create 명령어를 사용하여 간단한 Docker 서비스를 생성합니다. Docker 서비스는 동일한 이미지의 컨테이너 그룹입니다. 서비스를 생성할 때 사용할 컨테이너 이미지와 컨테이너 내에서 실행할 명령어를 정의합니다.
먼저, Docker 컨테이너에서 일반적으로 사용되는 경량 Linux 배포판인 alpine 이미지를 가져옵니다.
docker pull alpine
이미지를 가져와 다운로드하는 것을 나타내는 출력을 볼 수 있습니다.
Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
이제 alpine 이미지를 사용하여 my-service라는 Docker 서비스를 생성합니다. 또한 서비스의 각 컨테이너 내에서 실행할 ping labex.io 명령어를 지정합니다. --name 플래그는 서비스에 이름을 할당하고, alpine ping labex.io 부분은 이미지와 실행할 명령어를 지정합니다.
docker service create --name my-service alpine ping labex.io
명령어를 실행한 후, 서비스가 생성되었음을 나타내는 다음과 유사한 출력을 보게 됩니다. 긴 문자열은 서비스 ID 입니다.
p1234567890abcdefghijklmnopqrstu
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
서비스가 실행 중인지 확인하려면 docker service ls 명령어를 사용할 수 있습니다. 이 명령어는 Docker swarm 에서 실행 중인 모든 서비스를 나열합니다.
docker service ls
다음과 유사한 출력을 볼 수 있으며, my-service가 1 개의 레플리카 (replica) 와 함께 실행 중인 것을 보여줍니다.
ID NAME MODE REPLICAS IMAGE PORTS
p1234567890 my-service replicated 1/1 alpine:latest
이는 Docker 서비스 my-service가 성공적으로 생성되었고 ping labex.io 명령어를 실행하는 하나의 작업 (컨테이너) 으로 실행 중임을 확인합니다.
전체 서비스 로그 보기
이전 단계에서 ping labex.io 명령어를 실행하는 컨테이너를 실행하는 my-service라는 Docker 서비스를 생성했습니다. 이 명령어는 실행되는 동안 출력을 생성합니다 (로그). 이 단계에서는 전체 서비스에 대한 로그를 보는 방법을 배우겠습니다.
Docker 서비스의 로그를 보려면 서비스 이름 뒤에 docker service logs 명령어를 사용합니다.
docker service logs my-service
이 명령어를 실행하면 my-service 서비스에 속한 모든 작업 (컨테이너) 에서 생성된 로그가 표시됩니다. 현재 서비스에는 하나의 작업만 있으므로 해당 컨테이너에서 실행되는 ping labex.io 명령어의 출력을 보게 됩니다.
my-service.1.abcdefghijkl PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...
출력은 서비스 이름, 작업 번호 및 고유한 작업 ID 가 앞에 붙은 로그 항목을 보여줍니다. 이를 통해 서비스에 대해 여러 작업이 실행 중일 때 어떤 작업이 어떤 로그 항목을 생성했는지 식별하는 데 도움이 됩니다.
-f 또는 --follow 플래그를 사용하여 로그를 실시간으로 스트리밍할 수도 있습니다. 이는 서비스의 활동을 실시간으로 모니터링하는 데 유용합니다.
docker service logs -f my-service
이 명령어는 서비스의 작업에서 생성되는 새로운 로그 항목을 지속적으로 표시합니다. 로그 추적을 중지하려면 Ctrl+C를 누르십시오.
전체 서비스에 대한 로그를 보는 것은 서비스의 상태와 활동에 대한 전반적인 그림을 얻는 데 도움이 됩니다.
서비스 내 특정 태스크 로그 보기
이전 단계에서는 전체 my-service에 대한 로그를 보았습니다. 서비스에 여러 작업 (replica) 이 있는 경우, 결합된 로그를 보는 것이 압도적일 수 있습니다. 이 단계에서는 서비스 내 특정 작업에 대한 로그를 보는 방법을 배우겠습니다.
먼저, 로그를 보려는 작업 ID 를 식별해야 합니다. docker service ps 명령어를 사용하여 이 정보를 얻을 수 있으며, 이 명령어는 서비스와 관련된 작업을 나열합니다.
docker service ps my-service
이 명령어를 실행하면 my-service에 대해 실행 중인 작업이 표시됩니다. 출력은 다음과 유사하게 나타납니다.
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
abcdefghijkl my-service.1 alpine:latest labex-vm Running Running 2 minutes ago
이 출력에서 abcdefghijkl은 작업 ID 이고, my-service.1은 작업 이름입니다. 작업 이름은 서비스 이름과 작업 번호로 구성됩니다.
특정 작업에 대한 로그를 보려면 docker service logs 명령어를 사용하고 그 뒤에 작업 ID 를 입력합니다.
docker service logs abcdefghijkl
참고: abcdefghijkl을 docker service ps 명령어 출력에서 얻은 실제 작업 ID 로 바꾸십시오.
이 명령어를 실행하면 해당 특정 작업에 대해 실행 중인 컨테이너에서 생성된 로그만 표시됩니다. 이는 개별 작업의 문제를 디버깅하는 데 유용합니다.
my-service.1.abcdefghijkl PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...
여기에서도 -f 플래그를 사용하여 특정 작업의 로그를 실시간으로 추적할 수 있습니다.
docker service logs -f abcdefghijkl
개별 작업에 대한 로그를 보면 문제를 격리하고 서비스의 특정 인스턴스의 동작을 이해할 수 있습니다.
옵션을 사용하여 서비스 로그 필터링 및 형식 지정
이 단계에서는 docker service logs 명령어의 출력을 필터링하고 형식 지정하는 데 유용한 몇 가지 옵션을 살펴보겠습니다. 이러한 옵션은 로그에서 특정 정보를 찾고 출력을 더 읽기 쉽게 만드는 데 도움이 될 수 있습니다.
일반적인 요구 사항 중 하나는 가장 최근의 로그 항목만 보는 것입니다. --tail 옵션을 사용하여 로그 끝에서 표시할 줄 수를 지정할 수 있습니다. 예를 들어, my-service에 대한 마지막 5 줄의 로그를 보려면 다음과 같이 합니다.
docker service logs --tail 5 my-service
이렇게 하면 서비스에서 마지막 5 개의 로그 항목이 출력됩니다.
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=10 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=11 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=12 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=13 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=14 ttl=50 time=123.456 ms
또 다른 유용한 옵션은 --since로, 특정 타임스탬프 또는 기간 이후에 생성된 로그를 볼 수 있습니다. 예를 들어, 지난 5 분 동안 생성된 로그를 보려면 다음과 같이 합니다.
docker service logs --since 5m my-service
RFC3339Nano 형식, 날짜 (YYYY-MM-DD) 또는 날짜 및 시간 (YYYY-MM-DDTHH:MM:SS) 으로 특정 타임스탬프를 지정할 수도 있습니다.
출력에 타임스탬프를 포함하려면 --timestamps 또는 -t 플래그를 사용합니다.
docker service logs -t my-service
이렇게 하면 각 로그 항목의 시작 부분에 타임스탬프가 추가됩니다.
2023-10-27T10:30:00.123456789Z my-service.1.abcdefghijkl PING labex.io (1.2.3.4): 56 data bytes
2023-10-27T10:30:01.123456789Z my-service.1.abcdefghijkl 64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
...
마지막으로, 이러한 옵션을 결합하여 로그 보기를 세분화할 수 있습니다. 예를 들어, 타임스탬프와 함께 마지막 10 개의 로그 항목을 보려면 다음과 같이 합니다.
docker service logs --tail 10 -t my-service
이러한 옵션은 Docker 서비스 로그를 보고 분석하는 방법에 대한 유연성을 제공하여 애플리케이션을 더 쉽게 모니터링하고 문제 해결할 수 있도록 합니다.
Lab 을 마치기 전에 생성한 서비스를 정리해 보겠습니다. docker service rm 명령어를 사용하여 서비스를 제거할 수 있습니다.
docker service rm my-service
서비스 제거를 확인하는 출력이 표시됩니다.
my-service
이 명령어는 서비스와 관련된 모든 작업을 중지하고 제거합니다.
요약
이 Lab 에서는 docker service create 명령어를 사용하여 간단한 Docker 서비스를 생성하는 방법을 배웠습니다. 이미지와 서비스의 작업 내에서 실행할 명령어를 지정했습니다. docker service ls를 사용하여 서비스 생성 및 상태를 확인했습니다.
그런 다음 docker service logs <service_name>을 사용하여 전체 서비스에 대한 로그를 보는 방법과, docker service ps <service_name>을 사용하여 먼저 작업 ID 를 식별한 다음 docker service logs <task_id>를 사용하여 서비스 내 특정 작업에 대한 로그를 보는 방법을 살펴보았습니다. 마지막으로, 로그 출력을 필터링하고 형식 지정하기 위해 docker service logs와 함께 다양한 옵션을 사용하는 방법을 배웠습니다. 예를 들어, 로그를 스트리밍하는 --follow, 특정 시간부터 로그를 보는 --since, 마지막 N 줄의 로그를 보는 --tail 등이 있습니다.



