Docker

Docker 강좌 07강 — 운영 팁: 로그·정리·트러블슈팅 & 다음 단계

🎯 학습 목표

  • 로그·리소스·정리 명령으로 Docker 환경을 건강하게 유지한다.
  • WSL+Docker에서 자주 만나는 오류를 스스로 해결한다.
  • 만든 이미지를 레지스트리에 올려 배포하는 흐름을 안다.

📖 개념 설명

컨테이너를 오래 쓰다 보면 안 쓰는 이미지·볼륨·캐시가 쌓여 디스크를 잡아먹습니다. 특히 WSL2는 디스크 이미지가 한 번 커지면 자동으로 줄지 않으므로, 주기적인 정리가 중요합니다. 또한 문제가 생겼을 때는 거의 항상 로그가 답을 알고 있습니다.

💻 로그와 진단

docker logs -f --tail 100 컨테이너명    # 최근 100줄부터 실시간
docker stats                          # CPU/메모리 실시간 사용량
docker exec -it 컨테이너명 bash        # 컨테이너 내부 진입(쉘)
docker inspect 컨테이너명              # 상세 설정(JSON)
docker compose logs -f                # compose 전체 로그

💻 정리 (디스크 회수)

docker system df                 # 무엇이 용량을 먹는지 확인
docker container prune           # 중지된 컨테이너 일괄 삭제
docker image prune -a            # 사용 안 하는 이미지 삭제
docker volume prune              # 안 쓰는 볼륨 삭제(데이터 주의!)
docker system prune -a --volumes # 전부 정리 (강력, 주의)

# WSL 디스크가 부풀었을 때(윈도우 PowerShell)
#   wsl --shutdown  후
#   diskpart 또는 Optimize-VHD 로 vhdx 축소

💻 자주 만나는 오류

# 1) Cannot connect to the Docker daemon
#    → Engine 미기동. Desktop 실행 or: sudo service docker start

# 2) port is already allocated
#    → 포트 충돌. docker ps로 점유 확인 or -p 다른포트:컨테이너포트

# 3) 앱→DB 연결 실패(Connection refused)
#    → DB 호스트를 localhost로 적음. compose 서비스 이름으로 변경
#    → DB 준비 전 앱 시작. healthcheck + depends_on 적용

# 4) WSL에서 빌드/IO가 느림
#    → 프로젝트를 /mnt/c 가 아닌 리눅스 홈(~/)으로 이동

💻 이미지 배포 (Docker Hub 예시)

# 로그인
docker login

# 이미지에 사용자명/태그 부여
docker tag demo-app:1.0 myname/demo-app:1.0

# 푸시
docker push myname/demo-app:1.0

# 서버에서는 받아서 실행만
docker pull myname/demo-app:1.0
docker run -d -p 8080:8080 myname/demo-app:1.0

🧭 다음 단계

  • Docker 네트워크 심화: 리버스 프록시(nginx/Traefik)로 여러 앱 라우팅.
  • CI/CD: GitHub Actions에서 이미지 빌드·푸시 자동화.
  • 오케스트레이션: 규모가 커지면 Kubernetes로 확장.
  • 관측성: 로그·메트릭 수집(ELK, Prometheus/Grafana).

💡 팁

  • 정리 명령은 강력합니다. prune 계열은 무엇이 지워지는지 먼저 확인하고 실행하세요.
  • 운영 컨테이너에는 --restart=unless-stopped를 붙여 재부팅 후에도 자동 기동되게 하세요.
  • 이 강좌의 compose 구성을 그대로 깃에 올려두면, 새 PC에서도 docker compose up 한 줄로 동일 환경을 재현할 수 있습니다.