Docker 실행 시 port 사용 불가 에러

twonezero·2024년 10월 9일
0
post-thumbnail
post-custom-banner

문제 상황

프로젝트를 진행하면서, 여러 팀원과 환경을 맞추기 위해 편리하게 docker 를 설정 후 실행하고 있었다.

그런데, 어느 날 잘 실행되던 docker 가 안되는 것이다...!
아래 사진은 에러 내용이다.

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:2181 -> 0.0.0.0:0: listen tcp 0.0.0.0:2181: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

내용을 살펴보면, docker를 2181 port 로 binding 하려고 하면 접근 권한이 없다고 하는 것 같다.

원인 파악

팀원들 중 나만 윈도우 운영체제를 사용하고 있어서 나에게만 발생한 에러이기에 window, docker port bind error 등의 단어 조합으로 검색했더니 좋은 글을 발견했다.

https://blog.retrotv.dev/docker-bind-error/

원인은 아래와 같을 것이라고 해당 글에서는 말하고 있다.

일반적으로 포트를 점유한 프로세스도 찾을 수 없는데도 해당 포트를 사용 중인 상황을 겪고 있다면, 보통은 운영체제나 프로세스에 의해 미리 동적 포트가 할당되어서 그럴 가능성이 높다. 운영체제나 프로세스는 처음 시작 시, 시스템에서 사용할 포트를 동적으로 할당 시킨다. 당연한 소리지만, 이 때 할당된 포트는 사용자가 사용할 수 없다. 컴퓨터를 재부팅 시, 다시 포트를 사용 할 수 있게 되는 것은 매번 이 동적으로 할당된 포트가 바뀌게 되기 때문이다.

잘 되던 docker 가 실행이 안 되었던 이유가 운영체제의 동적 포트 점유 때문이라는 것을 알았다! 우선, 점유된 port 가 어떤 것인지 확인하려면 Powershell 을 열어 아래 명령어를 입력하자.

netsh interface ipv4 show excludedportrange protocol=tcp

위 사진과 같이, 여러 범위로 포트들이 운영체제에 의해 미리 할당돼있는 것을 볼 수 있다. (문제 발생 시, port 사진이 없어서 퍼온 사진입니다.)

그래서 해당 글에서 제시한 해결책을 따르면, Powershell 에서 netsh(Network Shell 의 약자로 Windows 운영 체제에서 사용되는 명령줄 도구로, 네트워크 설정 및 관리를 위한 명령어)를 사용하여 내가 사용하고자 하는 port 를 미리 점유하는 설정을 하면 된다.

해결

  1. 일단 port가 다른 프로세스에 의해 사용 중일 가능성이 있으므로, window NAT(윈도우 NAT이란?) 네트워크를 멈추게 한다.
net stop winnat
  1. 그 다음, 내가 사용하고자 하는 port를 시스템 또는 다른 내부 프로세스가 사용하지 않도록 미리 점유해놓는다.
netsh int ipv4 add excludedportrange protocol=tcp startport=2181 numberofports=1 store=persistent
  • 중요한 것은 startport 를 통해 내가 사용하는 port 를 지정하는 것이다.
  • numberofports 는 startport 부터 어디 범위까지 지정할 지 설정하는 것이다.
  1. 위 명령어를 입력했다면, 다시 winnat 을 실행하고 확인해보자.
net start winnat

netsh interface ipv4 show excludedportrange protocol=tcp

나는 zookeeper 를 사용하기 위해 2181 포트를 미리 내가 사용할 수 있게 점유해놓았다. 숫자 맨 오른쪽에 '*' 표시가 시스템이나 내부 프로세스가 사용하지 않는다는 뜻이다.

정리

해당 문제 덕분에(?) window 가 관리하는 가상 네트워크에 대해 조금이라도 살펴보고 powershell 에 대한 사용도 조금 더 나아진 것 같다. 이제 더 이상 docker port 문제로 시간을 버리지는 않을 것 같다.

profile
소소한 행복을 즐기는 백엔드 개발자입니다😉
post-custom-banner

0개의 댓글