Docker를 운영하다 보면 컨테이너의 CPU 사용률이 갑자기 높아지거나 메모리 사용량이 증가하는 상황을 자주 접하게 됩니다. 이럴 때 대부분 docker stats 명령어를 먼저 실행하지만, 이 명령은 컨테이너의 리소스 사용량만 보여줄 뿐 실제 어떤 프로세스가 실행되고 있는지는 확인할 수 없습니다.
이때 사용하는 명령어가 docker top입니다.
docker top은 실행 중인 컨테이너 내부의 프로세스를 호스트에서 직접 확인할 수 있는 명령어입니다. Linux의 ps 명령과 비슷한 역할을 하지만 특정 컨테이너의 프로세스만 보여준다는 점이 가장 큰 특징입니다.
실무에서는 CPU 과부하 분석, 메모리 누수 확인, 좀비 프로세스 점검, 예상하지 못한 프로그램 실행 여부를 확인할 때 매우 자주 사용됩니다.
Docker Top 기본 사용법
기본 문법은 매우 간단합니다.
docker top <컨테이너명>
예를 들어 nginx 컨테이너를 확인하려면 다음과 같이 입력합니다.
docker top nginx
출력 예시는 다음과 같습니다.
UID PID PPID C STIME TIME CMD
root 1243 1200 0 10:20 00:00:00 nginx: master process
101 1255 1243 0 10:20 00:00:00 nginx: worker process
위 결과를 보면 현재 실행 중인 프로세스와 부모 프로세스, 실행 명령까지 한눈에 확인할 수 있습니다.
출력 항목 이해하기
Docker Top은 Linux의 ps 명령과 거의 동일한 정보를 제공합니다.
| 항목 | 설명 |
|---|---|
| UID | 프로세스를 실행한 사용자 |
| PID | 프로세스 ID |
| PPID | 부모 프로세스 ID |
| C | CPU 사용률 정보 |
| STIME | 프로세스 시작 시간 |
| TIME | 누적 CPU 사용 시간 |
| CMD | 실행 중인 명령 |
특히 PID와 PPID를 함께 보면 프로세스 간의 부모-자식 관계를 쉽게 파악할 수 있습니다.
PID와 PPID란?
PID(Process ID)는 운영체제가 프로세스를 구분하기 위해 부여하는 고유 번호입니다.
PPID(Parent Process ID)는 해당 프로세스를 실행한 부모 프로세스의 번호입니다.
예를 들어 다음과 같은 결과가 출력되었다면,
PID PPID
1255 1243
1255번 프로세스는 1243번 프로세스에 의해 생성된 자식 프로세스라는 의미입니다.
Nginx처럼 Master Process가 Worker Process를 생성하는 프로그램에서는 이러한 구조를 쉽게 확인할 수 있습니다.
docker stats와 함께 사용하는 방법
Docker Top은 docker stats와 함께 사용할 때 가장 효과적입니다.
먼저 리소스 사용량을 확인합니다.
docker stats
출력 결과입니다.
NAME CPU %
web 286%
db 12%
redis 3%
CPU 사용량이 높은 web 컨테이너를 발견했다면 다음 명령으로 내부 프로세스를 확인합니다.
docker top web
이렇게 하면 어떤 프로그램이 높은 CPU를 사용하는지 빠르게 파악할 수 있습니다.
자주 사용하는 옵션
Linux의 ps 옵션을 그대로 사용할 수도 있습니다.
docker top web aux
또는
docker top web -ef
aux는 CPU와 메모리 사용량을 함께 확인할 때 많이 사용하며, -ef는 부모 프로세스 관계를 분석할 때 자주 사용됩니다.
실무 활용 예제
Java 애플리케이션이 실행 중인지 확인하려면 다음과 같이 사용할 수 있습니다.
docker top app aux | grep java
Python 애플리케이션 확인
docker top app aux | grep python
Node.js 확인
docker top app aux | grep node
MySQL 확인
docker top mysql
Redis 확인
docker top redis
컨테이너 내부에서 어떤 프로그램이 실행 중인지 빠르게 확인할 수 있어 장애 분석 시간을 크게 줄일 수 있습니다.
Linux 서버 문제 해결
운영 중인 서버에서 응답 속도가 급격히 느려졌다고 가정해 보겠습니다.
먼저 docker stats를 실행한 결과 worker 컨테이너의 CPU 사용률이 320%까지 상승한 것을 확인했습니다.
이후 docker top worker aux를 실행해 보니 python worker.py 프로세스가 대부분의 CPU를 사용하고 있었습니다.
추가로 docker logs worker를 확인한 결과 외부 API 호출 실패로 인해 무한 재시도 루프가 발생하고 있음을 확인했습니다.
환경 변수와 API 주소를 수정한 후 컨테이너를 재시작하자 CPU 사용률은 정상 수준으로 돌아왔습니다.
이처럼 Docker Top은 문제의 원인을 빠르게 좁혀 나가는 데 매우 중요한 명령어입니다.
자주 묻는 질문
Q. docker top과 docker stats의 차이는 무엇인가요?
docker stats는 CPU, 메모리 등 리소스 사용량을 보여주고, docker top은 실행 중인 프로세스 목록을 보여줍니다.
Q. 컨테이너 내부에 접속하지 않아도 사용할 수 있나요?
네. docker exec 없이도 호스트에서 바로 프로세스를 확인할 수 있습니다.
Q. PID는 호스트에서도 확인 가능한가요?
네. docker top에 표시되는 PID는 일반적으로 호스트의 ps 명령에서도 동일하게 확인할 수 있습니다.
마무리
docker top은 컨테이너 내부에서 어떤 프로세스가 실행 중인지 확인하는 가장 기본적이면서도 중요한 Docker 명령어입니다.
CPU 사용량이 높거나 메모리 누수가 의심되는 상황에서는 docker stats로 이상 징후를 확인한 뒤 docker top으로 실행 중인 프로세스를 분석하면 문제를 훨씬 빠르게 해결할 수 있습니다.
실무에서는 docker logs, docker inspect, docker exec와 함께 활용하면 대부분의 컨테이너 문제를 효과적으로 진단할 수 있습니다.