🎯 학습 목표
- 로그·리소스·정리 명령으로 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한 줄로 동일 환경을 재현할 수 있습니다.