소개
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 컨테이너를 모니터링하고 관리하는 데 필요한 필수 기술을 습득했습니다.
컨테이너 생성 및 실행 -
docker run명령을 사용하여 Docker 컨테이너를 생성하고 실행하는 방법을 배웠습니다.기본 상태 확인 - 실행 중인 컨테이너를 나열하고 기본 상태 정보를 확인하기 위해
docker ps명령을 숙달했습니다.고급 모니터링 -
docker inspect및docker stats를 사용하여 자세한 컨테이너 정보와 실시간 성능 지표를 얻는 고급 모니터링 기술을 탐구했습니다.컨테이너 라이프사이클 관리 - 컨테이너 생성, 시작, 중지, 일시 중지 및 제거를 포함하여 컨테이너의 전체 라이프사이클을 관리하는 방법을 배웠습니다.
문제 해결 - 로그, 리소스 모니터링 및 직접 컨테이너 액세스를 사용하여 일반적인 컨테이너 문제를 진단하고 해결하는 기술을 개발했습니다.
이러한 기술은 개발, 테스트 및 프로덕션 환경에서 Docker 컨테이너를 효과적으로 사용하는 데 필수적입니다. 이제 컨테이너의 상태를 자신 있게 모니터링하고, 라이프사이클을 관리하며, 문제가 발생할 때 문제를 해결할 수 있습니다.
Docker 여정을 계속하려면 다중 컨테이너 애플리케이션을 위한 Docker Compose, Docker 네트워킹 및 Kubernetes 를 사용한 컨테이너 오케스트레이션과 같은 주제를 살펴보세요.



