https://github.com/docker/for-win/issues/3171
Unable to bind ports: Docker-for-Windows & Hyper-V excluding but not using important port ranges · Issue #3171 · docker/for-wi
I have tried with the latest version of my channel (Stable or Edge) I have uploaded Diagnostics Diagnostics ID: BB0297BB-C287-4F0B-A007-72B5F2D7BD72/20190102235413 Expected behavior Be able to bind...
github.com
ChatGPT의 말:
아, 완벽히 짚으셨네요 🔥
그렇습니다 — 도커(특히 Windows + Docker Desktop 환경) 에서는
winnat 서비스가 네트워크 주소 변환(NAT)을 관리하면서
일부 포트를 “예약”해두는 경우가 있습니다.
이게 바로 netstat에는 잘 안 잡히면서도,
Spring Boot가 8080 바인딩 시 "port already in use" 오류를 발생시키는 대표적인 원인이죠 💡
✅ 왜 이런 현상이 생기냐면
Windows용 Docker Desktop은
- 내부적으로 HNS (Host Network Service) 와 WinNAT (Windows NAT Driver) 를 사용해
가상 네트워크(예: vEthernet (DockerNAT))를 구성합니다. - 이때 Docker가 포트 포워딩 설정을 미리 등록하면서
일부 포트를 WinNAT 포트 매핑 테이블에 “예약” 해둡니다.
즉, 실제 프로세스는 없지만
운영체제 수준에서는 8080이 “사용 중”으로 표시되는 상황입니다.
✅ 확인 방법
PowerShell에서 관리자 권한으로 실행 👇
또는
8080 관련 엔트리가 있다면 예를 들어 이렇게 보입니다:
➡ 이게 WinNAT이 Docker 컨테이너로 포트 8080을 매핑한 상태입니다.
✅ 해결 방법
👉 1️⃣ 포트 매핑 삭제
또는 특정 주소로 되어 있으면 그 주소 지정:
👉 2️⃣ winnat 테이블에서 확인 및 정리
필요시 삭제:
👉 3️⃣ Docker 재시작
혹은 Docker Desktop UI → Restart Docker
✅ 추가 팁
앞으로 포트 충돌 피하려면
Spring Boot 쪽 application.properties 에서
아래처럼 환경 변수 기반 포트 설정을 해두면 좋아요 👇
→ 이렇게 하면 도커 컨테이너나 로컬 실행 시
환경 변수로 포트를 유연하게 바꿀 수 있습니다.
👍 결론적으로,
"도커가 WinNAT을 통해 8080을 예약한 상태라 Spring Boot 내장 톰캣이 포트를 못 연 것"
정확한 원인 분석 맞습니다 👏
이건 실제로 많은 개발자들이 겪는 “보이지 않는 포트 점유” 문제 중 하나예요.
winnat 껐다 켜는 방법:
사용중인 포트가 없는데 있다고 ?
오늘 굉장히 당황스러운 문제가 발생했습니다."8080포트가 이미 사용 중입니다."하지만 실제로 포트를 점유한 프로세스는 없는 기이한 상황이었어요. 🫤
until.blog