Docker 컨테이너 상태 확인 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션 개발, 배포 및 관리 방식을 혁신적으로 변화시켰습니다. 강력한 컨테이너화 플랫폼인 Docker 를 사용하면 애플리케이션과 해당 종속성을 격리되고 이식 가능한 환경으로 패키징할 수 있습니다. Docker 컨테이너의 상태를 확인하는 방법을 아는 것은 효과적인 관리 및 문제 해결에 매우 중요합니다.

이 실습에서는 Docker 컨테이너를 모니터링하고, 상태를 이해하며, 수명 주기를 관리하는 데 필요한 필수 명령어를 배우게 됩니다. 이 튜토리얼을 마치면 효율적인 애플리케이션 개발 및 배포를 위해 Docker 컨테이너의 상태를 자신 있게 확인하고 관리할 수 있게 됩니다.

Docker 컨테이너 생성 및 실행

Docker 컨테이너의 상태를 확인하기 전에, 몇 개의 컨테이너가 실행 중이어야 합니다. 이 단계에서는 간단한 Docker 컨테이너를 생성하고 실행합니다.

Docker 컨테이너 이해

Docker 컨테이너는 애플리케이션을 실행하는 데 필요한 모든 것 (코드, 런타임, 시스템 도구, 라이브러리 및 설정) 을 포함하는 가볍고 독립적인 실행 가능한 소프트웨어 패키지입니다. 컨테이너는 서로 다른 개발 단계에서 일관된 환경을 제공합니다.

Docker 컨테이너 사용의 장점은 다음과 같습니다.

  • 일관된 런타임 환경
  • 다른 애플리케이션과의 격리
  • 빠른 배포 및 확장
  • 효율적인 리소스 활용

Docker 설치 확인

먼저 Docker 가 시스템에 제대로 설치되었는지 확인해 보겠습니다.

docker --version

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

Docker version 20.10.21, build baeda1f

첫 번째 컨테이너 실행

공식 Nginx 웹 서버 이미지를 사용하여 간단한 컨테이너를 실행해 보겠습니다. 이렇게 하면 다음 단계에서 모니터링할 컨테이너가 생성됩니다.

터미널에서 다음 명령을 실행합니다.

docker run --name my-nginx -d -p 8080:80 nginx

이 명령어는 다음을 수행합니다.

  • my-nginx라는 이름의 컨테이너를 생성합니다.
  • 백그라운드에서 실행되는 detached 모드 (-d) 로 실행합니다.
  • 호스트의 포트 8080 을 컨테이너의 포트 80 에 매핑합니다 (-p 8080:80).
  • Docker Hub 에서 공식 nginx 이미지를 사용합니다.

컨테이너 ID 인 긴 문자열을 볼 수 있습니다.

a72369167c214c20247f786a47b6b0b8581b60324bd2d151a7a0db8ddb024959

이제 컨테이너가 실행 중인지 확인해 보겠습니다.

docker ps

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

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

축하합니다! Docker 컨테이너를 성공적으로 생성하고 시작했습니다. 다음 단계에서는 이 컨테이너의 상태를 자세히 확인하는 방법을 살펴보겠습니다.

기본 컨테이너 상태 명령어

이제 실행 중인 컨테이너가 있으므로 Docker 의 가장 일반적인 명령어를 사용하여 상태를 확인하는 방법을 알아보겠습니다.

docker ps 명령어 사용

docker ps 명령어는 실행 중인 컨테이너를 확인하는 가장 기본적인 방법입니다.

docker ps

출력은 다음과 유사해야 합니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp   my-nginx

이 명령어는 다음을 보여줍니다.

  • CONTAINER ID: 컨테이너의 고유 식별자
  • IMAGE: 컨테이너를 생성하는 데 사용된 Docker 이미지
  • COMMAND: 컨테이너 내에서 실행된 명령어
  • CREATED: 컨테이너가 생성된 시간
  • STATUS: 컨테이너의 현재 상태
  • PORTS: 호스트와 컨테이너 간의 포트 매핑
  • NAMES: 컨테이너에 할당된 이름

모든 컨테이너 보기

기본 docker ps 명령어는 실행 중인 컨테이너만 표시합니다. 중지된 컨테이너를 포함하여 모든 컨테이너를 보려면 다음을 사용합니다.

docker ps -a

이렇게 하면 상태에 관계없이 모든 컨테이너가 표시됩니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    0.0.0.0:8080->80/tcp   my-nginx

현재 컨테이너가 하나뿐이지만, 중지된 컨테이너가 있는 경우에도 여기에 표시됩니다.

형식 지정으로 컨테이너 상태 확인

--format 옵션을 사용하여 필요한 정보만 표시하도록 docker ps의 출력을 사용자 정의할 수 있습니다.

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

이렇게 하면 컨테이너 이름, 상태 및 포트만 표시하는 단순화된 테이블이 표시됩니다.

NAMES       STATUS          PORTS
my-nginx    Up 7 minutes    0.0.0.0:8080->80/tcp

컨테이너 중지

컨테이너의 상태가 어떻게 변경되는지 확인하기 위해 컨테이너를 중지해 보겠습니다.

docker stop my-nginx

출력:

my-nginx

이제 상태를 다시 확인합니다.

docker ps

실행 중인 컨테이너 목록에 더 이상 컨테이너가 표시되지 않는 것을 알 수 있습니다. 컨테이너를 보려면 다음을 사용합니다.

docker ps -a

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   10 minutes ago   Exited (0) 10 seconds ago             my-nginx

컨테이너의 상태가 "Exited"로 변경되어 더 이상 실행되지 않음을 나타냅니다.

컨테이너 시작

컨테이너를 다시 시작해 보겠습니다.

docker start my-nginx

출력:

my-nginx

상태를 확인하여 실행 중인지 확인합니다.

docker ps

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a72369167c21   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 5 seconds    0.0.0.0:8080->80/tcp   my-nginx

훌륭합니다! 이제 docker ps 명령어를 사용하여 Docker 컨테이너의 기본 상태를 확인하고 컨테이너를 중지하고 시작하는 방법을 이해했습니다.

고급 컨테이너 모니터링

이제 컨테이너 상태 확인의 기본 사항을 이해했으므로 컨테이너에 대한 자세한 정보를 제공하는 고급 모니터링 명령어를 살펴보겠습니다.

docker inspect를 사용한 자세한 컨테이너 정보

docker inspect 명령어는 컨테이너에 대한 자세한 구성 및 런타임 정보를 제공합니다.

docker inspect my-nginx

이 명령어는 컨테이너에 대한 포괄적인 정보가 포함된 JSON 배열을 반환합니다. 출력은 상당히 길지만 다음을 포함합니다.

  • 네트워크 설정
  • 볼륨 마운트
  • 환경 변수
  • 리소스 제한
  • 컨테이너 상태
  • 그리고 훨씬 더 많은 정보

--format 옵션을 사용하여 특정 섹션을 살펴보겠습니다.

docker inspect --format='{{.State.Status}}' my-nginx

출력:

running

다른 특정 정보 조각을 추출할 수 있습니다.

docker inspect --format='{{.NetworkSettings.IPAddress}}' my-nginx

이렇게 하면 컨테이너의 내부 IP 주소가 표시됩니다.

docker stats를 사용한 실시간 컨테이너 메트릭

docker stats 명령어는 컨테이너 리소스 사용량 통계의 실시간 스트림을 제공합니다.

docker stats my-nginx

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

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
a72369167c21   my-nginx   0.00%     2.312MiB / 7.764GiB   0.03%     1.05kB / 1.51kB   0B / 4.1kB       2

이것은 다음을 보여줍니다.

  • CPU 사용량 백분율
  • 메모리 사용량
  • 네트워크 I/O
  • 블록 I/O
  • 프로세스 수

실시간 통계 보기를 종료하려면 Ctrl+C를 누르십시오.

모든 컨테이너의 통계를 한 번에 보려면 다음을 사용합니다.

docker stats --no-stream

이렇게 하면 지속적인 업데이트 없이 통계의 스냅샷이 표시됩니다.

컨테이너 로그 보기

문제를 해결하려면 컨테이너의 로그를 확인하는 것이 유용한 경우가 많습니다.

docker logs my-nginx

Nginx 서버의 로그를 볼 수 있습니다. 웹 서버에 액세스한 경우 HTTP 요청 로그를 볼 수 있습니다.

실시간으로 로그를 따르려면 (tail -f와 유사):

docker logs -f my-nginx

로그 스트림을 종료하려면 Ctrl+C를 누르십시오.

컨테이너 프로세스 확인

컨테이너 내에서 실행 중인 프로세스를 보려면 다음을 사용합니다.

docker top my-nginx

출력은 다음과 유사합니다.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12345               12321               0                   14:15               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            12401               12345               0                   14:15               ?                   00:00:00            nginx: worker process

이것은 컨테이너 내에서 실행 중인 모든 프로세스, 해당 PID 및 리소스 사용량을 보여줍니다.

비교를 위한 새 컨테이너 생성

기존 컨테이너와 비교할 다른 컨테이너를 생성해 보겠습니다.

docker run --name redis-server -d redis

이제 두 컨테이너의 통계를 비교해 보겠습니다.

docker stats --no-stream my-nginx redis-server

두 컨테이너의 통계를 볼 수 있으며, 이를 통해 리소스 사용량을 비교할 수 있습니다.

이러한 고급 모니터링 명령어는 문제 해결 및 리소스 사용량 최적화에 필수적인 컨테이너의 상태 및 성능에 대한 더 깊은 통찰력을 제공합니다.

컨테이너 라이프사이클 관리

컨테이너의 라이프사이클을 관리하는 방법을 이해하는 것은 효과적인 Docker 사용에 매우 중요합니다. 이 단계에서는 컨테이너 상태를 제어하고 컨테이너 라이프사이클을 이해하기 위한 다양한 명령어를 살펴보겠습니다.

컨테이너 라이프사이클 상태

Docker 컨테이너는 여러 상태로 존재할 수 있습니다.

  • Created (생성됨): 컨테이너가 생성되었지만 시작되지 않음
  • Running (실행 중): 컨테이너가 현재 실행 중
  • Paused (일시 중지됨): 컨테이너 실행이 일시 중지됨
  • Stopped (중지됨): 컨테이너가 중지되었지만 여전히 존재함
  • Removed (삭제됨): 컨테이너가 삭제됨

이러한 상태 간의 전환 방법을 살펴보겠습니다.

시작하지 않고 컨테이너 생성

create 명령어를 사용하여 시작하지 않고 컨테이너를 생성할 수 있습니다.

docker create --name test-container nginx

이렇게 하면 컨테이너가 생성되지만 시작되지 않습니다. 상태를 확인합니다.

docker ps -a

"Created" 상태의 새 컨테이너가 표시됩니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   5 seconds ago    Created                                            test-container
a72369167c21   nginx     "/docker-entrypoint.…"   40 minutes ago   Up 30 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes               6379/tcp               redis-server

생성된 컨테이너 시작

생성된 컨테이너를 시작하려면:

docker start test-container

실행 중인지 확인합니다.

docker ps

컨테이너 일시 중지 및 일시 중지 해제

Docker 를 사용하면 컨테이너를 일시 중지하여 내부의 모든 프로세스를 중지할 수 있습니다.

docker pause test-container

상태를 확인합니다.

docker ps

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS                  NAMES
3f4ab92d1234   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 1 minute (Paused)                           test-container
a72369167c21   nginx     "/docker-entrypoint.…"   42 minutes ago   Up 32 minutes           0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes           6379/tcp               redis-server

컨테이너를 다시 시작하려면:

docker unpause test-container

다시 실행 중인지 확인합니다.

docker ps

컨테이너 중지 및 다시 시작

컨테이너를 정상적으로 중지하려면 (SIGTERM 을 보내고, 유예 기간 후에 SIGKILL 을 보냄):

docker stop test-container

컨테이너를 강제로 종료하려면 (SIGKILL 을 보냄):

docker start test-container ## Start it again first
docker kill test-container  ## Then kill it

컨테이너를 다시 시작하려면 (중지했다가 다시 시작):

docker start test-container ## Start it again first
docker restart test-container

컨테이너 제거

중지된 컨테이너를 제거하려면:

docker stop test-container ## Make sure it's stopped first
docker rm test-container

제거되었는지 확인합니다.

docker ps -a | grep test-container

출력이 없어야 하며, 이는 컨테이너가 제거되었음을 나타냅니다.

실행 중인 컨테이너 제거

실행 중인 컨테이너를 강제로 제거할 수 있습니다.

docker run --name temp-container -d nginx
docker rm -f temp-container

컨테이너 재시작 정책

Docker 를 사용하면 컨테이너에 대한 재시작 정책을 설정할 수 있습니다.

docker run --name always-restart --restart always -d nginx

이 컨테이너는 종료되거나 Docker 가 다시 시작되면 자동으로 다시 시작됩니다.

재시작 정책을 확인합니다.

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' always-restart

출력:

always

이 컨테이너를 중지하고 제거해 보겠습니다.

docker rm -f always-restart

이러한 라이프사이클 명령어를 이해하면 Docker 컨테이너를 완벽하게 제어할 수 있으며, 애플리케이션 요구 사항에 따라 상태를 효율적으로 관리할 수 있습니다.

컨테이너 문제 해결

적절한 모니터링 및 관리에도 불구하고 컨테이너는 때때로 문제를 겪을 수 있습니다. 이 단계에서는 Docker 의 진단 도구를 사용하여 일반적인 컨테이너 문제를 해결하는 방법을 배웁니다.

일반적인 컨테이너 문제

컨테이너는 다양한 이유로 실패할 수 있습니다.

  • 애플리케이션 충돌
  • 리소스 제한
  • 구성 문제
  • 네트워크 문제
  • 권한 오류

이러한 문제를 식별하고 진단하는 방법을 살펴보겠습니다.

문제가 있는 컨테이너 생성

잘못된 명령으로 인해 즉시 종료되는 컨테이너를 생성해 보겠습니다.

docker run --name problematic -d nginx sleep 5

이 컨테이너는 sleep 5 명령을 실행한 다음 5 초 후에 종료됩니다.

몇 초 동안 기다린 다음 상태를 확인합니다.

docker ps -a

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                  NAMES
1a2b3c4d5e6f   nginx     "sleep 5"                10 seconds ago   Exited (0) 5 seconds ago                           problematic
a72369167c21   nginx     "/docker-entrypoint.…"   1 hour ago       Up 50 minutes               0.0.0.0:8080->80/tcp   my-nginx
bc123def456a   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes               6379/tcp               redis-server

컨테이너는 코드 0(성공) 으로 종료되었지만 더 이상 실행되지 않습니다.

컨테이너 종료 코드 확인

종료 코드는 컨테이너가 중지된 이유를 알려줄 수 있습니다.

  • 0: 성공
  • 0 이 아닌 값: 오류 발생

종료 코드를 보려면:

docker inspect problematic --format='{{.State.ExitCode}}'

출력:

0

이는 컨테이너가 할당된 작업을 완료한 후 성공적으로 종료되었음을 의미합니다.

컨테이너 로그 검사

로그는 문제 해결에 매우 중요합니다.

docker logs problematic

이 경우 sleep 명령이 로그를 생성하지 않으므로 출력이 표시되지 않을 수 있습니다.

로그를 생성할 다른 문제가 있는 컨테이너를 생성해 보겠습니다.

docker run --name crash-test -d nginx sh -c "echo 'Starting container'; sleep 2; echo 'About to crash'; exit 1"

몇 초 후에 상태 및 로그를 확인합니다.

docker ps -a | grep crash-test

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
f1e2d3c4b5a6   nginx     "sh -c 'echo 'Starti…"   10 seconds ago   Exited (1) 7 seconds ago              crash-test

이제 로그를 확인합니다.

docker logs crash-test

출력:

Starting container
About to crash

이러한 로그는 컨테이너가 충돌하기 전에 발생한 일에 대한 단서를 제공합니다.

리소스 사용량 확인

리소스 제약 조건으로 인해 컨테이너가 충돌하거나 성능이 저하될 수 있습니다.

docker stats --no-stream my-nginx

이는 CPU, 메모리 및 I/O 사용량을 표시하여 리소스 병목 현상을 식별하는 데 도움이 될 수 있습니다.

컨테이너 구성 확인

구성 오류는 일반적인 문제 원인입니다.

docker inspect my-nginx

다음 사항을 확인합니다.

  • 볼륨 마운트
  • 환경 변수
  • 네트워크 설정
  • 리소스 제한

실행 중인 컨테이너에 액세스

실행 중인 컨테이너 내부의 문제를 디버깅하려면:

docker exec -it my-nginx bash

이렇게 하면 컨테이너 내부에 셸이 제공되어 문제를 진단하기 위해 명령을 실행할 수 있습니다.

ls -la
ps aux
cat /etc/nginx/nginx.conf
exit ## To leave the container shell

정리

문제가 있는 컨테이너를 정리해 보겠습니다.

docker rm problematic crash-test

이러한 문제 해결 기술을 마스터하면 Docker 컨테이너의 문제를 신속하게 식별하고 해결하여 애플리케이션이 원활하고 안정적으로 실행되도록 할 수 있습니다.

요약

이 실습을 통해 Docker 컨테이너를 모니터링하고 관리하는 데 필요한 필수 기술을 습득했습니다.

  1. 컨테이너 생성 및 실행 - docker run 명령을 사용하여 Docker 컨테이너를 생성하고 실행하는 방법을 배웠습니다.

  2. 기본 상태 확인 - 실행 중인 컨테이너를 나열하고 기본 상태 정보를 확인하기 위해 docker ps 명령을 숙달했습니다.

  3. 고급 모니터링 - docker inspectdocker stats를 사용하여 자세한 컨테이너 정보와 실시간 성능 지표를 얻는 고급 모니터링 기술을 탐구했습니다.

  4. 컨테이너 라이프사이클 관리 - 컨테이너 생성, 시작, 중지, 일시 중지 및 제거를 포함하여 컨테이너의 전체 라이프사이클을 관리하는 방법을 배웠습니다.

  5. 문제 해결 - 로그, 리소스 모니터링 및 직접 컨테이너 액세스를 사용하여 일반적인 컨테이너 문제를 진단하고 해결하는 기술을 개발했습니다.

이러한 기술은 개발, 테스트 및 프로덕션 환경에서 Docker 컨테이너를 효과적으로 사용하는 데 필수적입니다. 이제 컨테이너의 상태를 자신 있게 모니터링하고, 라이프사이클을 관리하며, 문제가 발생할 때 문제를 해결할 수 있습니다.

Docker 여정을 계속하려면 다중 컨테이너 애플리케이션을 위한 Docker Compose, Docker 네트워킹 및 Kubernetes 를 사용한 컨테이너 오케스트레이션과 같은 주제를 살펴보세요.