본문 바로가기

카테고리 없음

netstat -ano | findstr :포트번호 로 사용중인 포트가 없지만 포트가 사용중이라고 할 때 (winnat 가상화 서비스 포트 예약)

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

도커를 사용한 가상화 환경에서 winnat 에 포트 예약이 되어 있어서 안되는거였음

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에서 관리자 권한으로 실행 👇

 
netsh interface portproxy show all

또는

 
netsh interface portproxy show v4tov4

8080 관련 엔트리가 있다면 예를 들어 이렇게 보입니다:

 
Listen on ipv4: Connect to ipv4: Address Port Address Port --------------- ---------- --------------- ---------- 0.0.0.0 8080 172.18.0.2 8080

➡ 이게 WinNAT이 Docker 컨테이너로 포트 8080을 매핑한 상태입니다.


✅ 해결 방법

👉 1️⃣ 포트 매핑 삭제

 
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0

또는 특정 주소로 되어 있으면 그 주소 지정:

 
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=127.0.0.1

👉 2️⃣ winnat 테이블에서 확인 및 정리

 
Get-NetNatStaticMapping

필요시 삭제:

 
Remove-NetNatStaticMapping -ExternalIPAddress "0.0.0.0" -ExternalPort 8080

👉 3️⃣ Docker 재시작

 
Restart-Service com.docker.service

혹은 Docker Desktop UI → Restart Docker


✅ 추가 팁

앞으로 포트 충돌 피하려면
Spring Boot 쪽 application.properties 에서
아래처럼 환경 변수 기반 포트 설정을 해두면 좋아요 👇

 
server.port=${SERVER_PORT:8080}

→ 이렇게 하면 도커 컨테이너나 로컬 실행 시
환경 변수로 포트를 유연하게 바꿀 수 있습니다.


👍 결론적으로,

"도커가 WinNAT을 통해 8080을 예약한 상태라 Spring Boot 내장 톰캣이 포트를 못 연 것"

정확한 원인 분석 맞습니다 👏
이건 실제로 많은 개발자들이 겪는 “보이지 않는 포트 점유” 문제 중 하나예요.

 

 

 

 

 

winnat 껐다 켜는 방법:

https://until.blog/@namcher9428/%EC%82%AC%EC%9A%A9%EC%A4%91%EC%9D%B8-%ED%8F%AC%ED%8A%B8%EA%B0%80-%EC%97%86%EB%8A%94%EB%8D%B0-%EC%9E%88%EB%8B%A4%EA%B3%A0--

 

사용중인 포트가 없는데 있다고 ?

오늘 굉장히 당황스러운 문제가 발생했습니다."8080포트가 이미 사용 중입니다."하지만 실제로 포트를 점유한 프로세스는 없는 기이한 상황이었어요. 🫤

until.blog