프로젝트를 진행하면서, 여러 팀원과 환경을 맞추기 위해 편리하게 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
등의 단어 조합으로 검색했더니 좋은 글을 발견했다.
원인은 아래와 같을 것이라고 해당 글에서는 말하고 있다.
일반적으로 포트를 점유한 프로세스도 찾을 수 없는데도 해당 포트를 사용 중인 상황을 겪고 있다면, 보통은 운영체제나 프로세스에 의해 미리 동적 포트가 할당되어서 그럴 가능성이 높다. 운영체제나 프로세스는 처음 시작 시, 시스템에서 사용할 포트를 동적으로 할당 시킨다. 당연한 소리지만, 이 때 할당된 포트는 사용자가 사용할 수 없다. 컴퓨터를 재부팅 시, 다시 포트를 사용 할 수 있게 되는 것은 매번 이 동적으로 할당된 포트가 바뀌게 되기 때문이다.
잘 되던 docker 가 실행이 안 되었던 이유가 운영체제의 동적 포트 점유 때문이라는 것을 알았다! 우선, 점유된 port 가 어떤 것인지 확인하려면 Powershell 을 열어 아래 명령어를 입력하자.
netsh interface ipv4 show excludedportrange protocol=tcp
위 사진과 같이, 여러 범위로 포트들이 운영체제에 의해 미리 할당돼있는 것을 볼 수 있다. (문제 발생 시, port 사진이 없어서 퍼온 사진입니다.)
그래서 해당 글에서 제시한 해결책을 따르면, Powershell 에서 netsh
(Network Shell 의 약자로 Windows 운영 체제에서 사용되는 명령줄 도구로, 네트워크 설정 및 관리를 위한 명령어)를 사용하여 내가 사용하고자 하는 port 를 미리 점유하는 설정을 하면 된다.
net stop winnat
netsh int ipv4 add excludedportrange protocol=tcp startport=2181 numberofports=1 store=persistent
startport
를 통해 내가 사용하는 port 를 지정하는 것이다.numberofports
는 startport 부터 어디 범위까지 지정할 지 설정하는 것이다.net start winnat
netsh interface ipv4 show excludedportrange protocol=tcp
나는 zookeeper 를 사용하기 위해 2181 포트를 미리 내가 사용할 수 있게 점유해놓았다. 숫자 맨 오른쪽에 '*' 표시가 시스템이나 내부 프로세스가 사용하지 않는다는 뜻이다.
해당 문제 덕분에(?) window 가 관리하는 가상 네트워크에 대해 조금이라도 살펴보고 powershell 에 대한 사용도 조금 더 나아진 것 같다. 이제 더 이상 docker port 문제로 시간을 버리지는 않을 것 같다.