안녕하세요 펭귄 교수입니다.
애플리케이션 개발 과정에서 디버깅은 매우 중요한 작업입니다.
도커(Docker)를 이용한 애플리케이션 배포 환경에서는 이러한 디버깅 작업이 컨테이너 내에서 이루어져야 합니다.
도커는 격리된 환경에서 애플리케이션을 실행하기 때문에, 컨테이너 안에서 디버깅을 잘 수행하는 것이 중요합니다.
이번 글에서는 도커 컨테이너 내에서 애플리케이션을 디버깅하는 방법, 기본적인 명령어 사용법, 그리고 여러 가지 디버깅 도구를 활용한 방법을 소개하겠습니다.
1. 도커 디버깅의 필요성
도커는 애플리케이션을 격리된 환경에서 실행하기 때문에 컨테이너 외부에서는 직접적으로 접근할 수 없습니다. 컨테이너 내의 애플리케이션이 오류를 일으킬 경우, 이를 해결하기 위해서는 컨테이너 내부의 상태를 파악해야 합니다.
주요 디버깅 대상
- 애플리케이션 오류 (Runtime error)
- 네트워크 설정 문제
- 파일 권한 문제
- 환경 변수 설정 오류
컨테이너 내부의 로그 확인, 실행 중인 프로세스 탐색, 애플리케이션의 동작 상태를 실시간으로 모니터링하는 방법이 필요합니다.
2. 도커 컨테이너 내부 접근하기
디버깅을 위해서는 우선 컨테이너 내부에 접근해야 합니다. 이를 위해 도커는 docker exec 명령어를 제공합니다. 실행 중인 컨테이너 내에서 쉘을 실행하고 그 안에서 명령어를 실행할 수 있습니다.
docker exec -it <컨테이너 이름 또는 ID> /bin/bash
# bash가 없는 컨테이너인 경우
docker exec -it <컨테이너 이름 또는 ID> /bin/sh
위 명령어는 해당 컨테이너 안에서 Bash 쉘을 실행하여, 컨테이너 내부로 진입할 수 있도록 해줍니다. 다른 쉘이 설치되어 있을 경우, /bin/sh 등 다른 옵션을 사용하면 됩니다.
예시
docker exec -it my-app-container /bin/bash
이 명령어를 사용하면 my-app-container라는 컨테이너 안에서 Bash 쉘을 사용할 수 있습니다. 이제 내부에서 파일을 탐색하거나 애플리케이션을 수동으로 실행해 볼 수 있습니다.
3. 컨테이너 로그 확인하기
디버깅의 첫 단계는 애플리케이션의 로그를 확인하는 것입니다. 도커는 기본적으로 컨테이너의 로그를 기록하며, docker logs 명령어로 이를 확인할 수 있습니다.
docker logs <컨테이너 이름 또는 ID>
예시
docker logs my-app-container
docker logs 명령어는 컨테이너의 표준 출력(STDOUT)과 표준 에러(STDERR) 출력을 보여줍니다. 이를 통해 애플리케이션의 오류나 경고 메시지를 확인할 수 있습니다.
실시간 로그 확인
실시간 로그를 확인하려면 -f 플래그를 사용합니다.
docker logs -f my-app-container
이 명령어는 로그의 마지막 부분을 지속적으로 업데이트하여 보여줍니다. 서버 애플리케이션처럼 계속해서 로그가 쌓이는 경우, 실시간으로 로그를 모니터링하며 디버깅할 수 있습니다.
4. 컨테이너 내부 프로세스 모니터링
컨테이너 내부에서 실행 중인 프로세스들을 확인하여 애플리케이션이 정상적으로 동작하고 있는지 모니터링하는 것도 중요합니다. 이를 위해 docker top 명령어를 사용할 수 있습니다.
docker top <컨테이너 이름 또는 ID>
예시
docker top my-app-container
이 명령어는 해당 컨테이너에서 실행 중인 모든 프로세스를 보여줍니다. 프로세스 목록을 확인하여, CPU나 메모리 자원을 과도하게 사용하는 프로세스가 있는지 점검할 수 있습니다.
5. 네트워크 디버깅
네트워크 연결 문제는 컨테이너 디버깅에서 매우 자주 발생하는 문제 중 하나입니다. 도커는 컨테이너 간 네트워크를 격리하는 특성이 있기 때문에, 네트워크 디버깅을 위해서는 몇 가지 도구를 사용할 수 있습니다.
5-1. 컨테이너 간 네트워크 연결 확인
컨테이너 간에 네트워크 연결 상태를 확인하려면 docker inspect 명령어를 사용하여 네트워크 설정을 확인할 수 있습니다.
docker inspect <컨테이너 이름 또는 ID>
5-2. 네트워크 연결 테스트
컨테이너 내부에서 curl이나 ping 명령어를 사용하여 다른 컨테이너 또는 외부 서버와의 연결을 테스트할 수 있습니다.
docker exec -it my-app-container ping google.com
위 명령어는 컨테이너 내부에서 Google 서버에 핑을 보내 네트워크 연결을 확인하는 예시입니다. 네트워크 문제는 컨테이너의 네트워크 설정이나 외부 방화벽 설정 문제로 발생할 수 있으므로, 이를 확인하는 것이 중요합니다.
6. 환경 변수 확인
애플리케이션이 올바르게 실행되지 않는 경우, 환경 변수가 제대로 설정되어 있는지 확인해야 합니다. 도커는 환경 변수를 설정하여 애플리케이션의 동작을 제어할 수 있습니다.
환경 변수 확인 명령어
컨테이너 내부에서 실행 중인 환경 변수를 확인하려면 다음 명령어를 사용할 수 있습니다.
docker exec -it <컨테이너 이름 또는 ID> printenv
예시
docker exec -it my-app-container printenv
이 명령어를 사용하면 my-app-container에서 설정된 모든 환경 변수를 출력하여 확인할 수 있습니다. 환경 변수가 제대로 설정되지 않은 경우, 이를 수동으로 수정하거나 컨테이너를 다시 시작할 때 올바른 값으로 설정해야 합니다.
7. 도커 디버깅 도구
도커 환경에서 애플리케이션을 디버깅할 때 사용할 수 있는 유용한 도구들이 있습니다.
7-1. strace 사용
strace는 시스템 호출을 추적하여 애플리케이션의 실행 상태를 확인하는 도구입니다. 도커 컨테이너 내에서도 사용할 수 있습니다. 이 도구는 애플리케이션의 시스템 호출을 실시간으로 추적하여 디버깅할 수 있도록 도와줍니다.
docker exec -it <컨테이너 이름 또는 ID> strace <프로세스 ID>
7-2. gdb 사용
gdb는 강력한 디버깅 도구로, C/C++ 같은 언어로 작성된 애플리케이션을 디버깅할 수 있습니다. 도커 컨테이너 내부에서 gdb를 사용하여 애플리케이션의 상태를 분석할 수 있습니다.
docker exec -it <컨테이너 이름 또는 ID> gdb <프로세스 ID>
8. Docker Compose와 디버깅
여러 컨테이너를 동시에 실행하는 경우 Docker Compose를 사용하여 디버깅할 수 있습니다. docker-compose up 명령어로 서비스를 실행한 후 각 컨테이너의 로그를 확인하거나, 특정 컨테이너에 대해 디버깅을 수행할 수 있습니다.
docker-compose logs <서비스 이름>
docker-compose exec <서비스 이름> /bin/bash
docker-compose logs는 모든 서비스의 로그를 확인할 수 있으며, docker-compose exec 명령어는 특정 서비스에 접근하여 디버깅할 수 있습니다.
9. 도커에서의 디버깅 자동화
반복적으로 발생하는 오류나 문제를 자동화된 스크립트로 처리하면 디버깅 시간을 단축할 수 있습니다. 다음은 디버깅 프로세스를 자동화하는 방법입니다.
9-1. 자동 로그 수집 스크립트
컨테이너 실행 시 자동으로 로그를 수집하는 스크립트를 작성하여 오류 발생 시 빠르게 확인할 수 있도록 설정할 수 있습니다.
#!/bin/bash
docker logs -f <컨테이너 이름> > /var/log/docker_logs.txt
이 스크립트는 특정 컨테이너의 로그를 docker_logs.txt 파일에 저장하여 나중에 확인할 수 있도록 도와줍니다.
9-2. 네트워크 상태 자동 점검 스크립트
네트워크 연결 문제를 자동으로 점검하는 스크립트도 작성할 수 있습니다.
#!/bin/bash
docker exec <컨테이너 이름> ping -c 4 google.com
이 스크립트는 컨테이너 내부에서 Google 서버에 핑을 보내 네트워크 상태를 점검하는 작업을 자동화합니다.
마무리
이렇게 도커 컨테이너에서 디버깅하는 방법들에 대해 알아보았습니다.
디버깅은 프로그램의 질을 급격히 상승시켜주고, 유지보수에 있어서도 없어서는 안되는 과정입니다.
도커 뿐만이 아니라 다른 언어, 프레임워크를 공부할 때 디버깅에 대해 깊게 공부해두시는 것을 추천드립니다.
다른 글 더보기
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 20편] 도커와 마이크로서비스 아키텍처 (0) | 2024.10.05 |
---|---|
[Docker 강의 19편] 도커와 쿠버네티스 기본 개념 (1) | 2024.10.05 |
[Docker 강의 17편] 도커와 CI/CD 파이프 라인 (0) | 2024.10.02 |
[Docker 강의 16편] 도커 로그 관리 (0) | 2024.10.01 |
[Docker 강의 15편] 도커 컨테이너 모니터링 (0) | 2024.09.30 |