Cannot start service backend: Ports are not available: listen tcp 0.0.0.0:3001: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 에러 해결하기

이동현·2021년 8월 5일
3

docker

목록 보기
1/1

사건 개요

docker desktop을 windows 10 환경에서 wsl2 로 잘 활용하고 있었다. 프로젝트를 진행하는 도중에 windows 10 업데이트가 있었고 그 이후에도 조금 하다가 컴퓨터를 리부팅하고 다시 docker-compose up 을 했더니 위와 같은 에러가 발생했다. 프로젝트에서는 frontend가 3000번 포트를 사용하고 backend가 3001번 포트를 사용했다.

원인

어떤 이유에선지 모르겠지만 나와 같은 경우를 다른 사람들도 역시나 겪었다. 구글링을 통해서 여러 방법들을 시도해보다가 비교적 빠른 시간 안에 문제를 해결할 수 있었다.

일단 에러메세지를 읽어보면 해당 port를 사용할 수 없다는 것이다. 그렇다면 내가 사용할 수 없는 포트를 볼 수 있는 방법은 무엇일까?

powershell을 켜서

~$ netsh interface ipv4 show excludedportrange protocol=tcp

다음 명령어를 쳐보자. 그러면 다음과 같은 결과가 출력될 것이다.

위의 화면에서 시작포트부터 끝 포트까지는 사용할 수 없다는 것이다.

그런데 신기하게도 컴퓨터를 다시 껏다 켜고 docker desktop을 실행하면 그 전과는 사용할 수 없는 포트의 범위가 달라져있다. 그래서 처음에는 계속 껏다 켜면서 3000번과 3001번을 사용할 수 있을 때까지 해야하나? 라는 무식한 생각도 했었지만 그건 아닌 것 같았다.

해결방법

그런데 게시글 맨 아래 출처에 적어놓은 스택오버플로우를 보면 어떤 사람이 작성한 방법이 내 경우에는 문제를 해결해줬다.

우선, 1.docker desktop을 실행시켜서 설정으로 들어간다.

2.노란색 네모박스 부분을 위 그림과 같이 Start Docker Desktop when you log in을 비활성화 시킨다. 나같은 경우에는 컴퓨터가 켜질 때 docker가 자동으로 실행되도록 하는 것을 설정변경해서 자동 시작이 안 되도록 해놨는데 그 설정도 해야 할 지도 모르겠다.

그 다음에 컴퓨터를 재부팅한다.

그러고 나서 docker desktop을 실행시키기 전에

~$ netsh interface ipv4 show excludedportrange protocol=tcp

이 명령어를 다시 쳐보면 제한된 포트의 범위가 훨씬 줄어있는 것을 볼 수 있다. 이것으로 포트의 범위를 제한시키는 대부분은 docker가 하는 일이라는 것을 알 수 있다.

3. docker를 실행하기 전에 ubuntu를 실행시킨다.

그러고 나서 4.docker desktop을 실행한다.

그러고나서 다시 제한된 포트 범위를 확인해봤더니 3000번, 3001번이 해당 범위안에 없는 것이다. 즉 사용할 수 있는 포트가 된 것이다.

이렇게 해서 다시 프로젝트를 정상적으로 진행할 수 있었다.

해결방법2

위와 같이 했을 때는 약간 완벽한 해결책이라고 보기는 어렵다. 사용자 환경에 따라 다를 수도 있고 보통 저렇게 했을 때 3000, 3001번 포트를 확보해서 사용하는 것은 대부분 될 수도 있으나 3000, 3001번 포트를 제외하고 다른 포트를 사용하고 싶은데 그 포트를 docker, ubuntu가 사용할 가능성도 있기 때문이다. docker와 Hyper-V가 실행을 하기 위해서 어떤 포트를 항상 예약을 해놓고 그 포트를 사용자가 사용하지 못하게 한다.

이런 문제를 해결하기 위해서는 사용자가 원하는 포트를 직접 예약을 해놓고 다른 프로그램 (예를 들어, docker, Hyper-V)가 그 포트를 사용하지 못하도록 미리 설정해놓으면 미리 예약한 포트를 사용자가 사용할 수 있다.

방법은 매우 간단하다. 1.일단 Hyper-V나 docker를 실행시키기 전(예를 들어, ubuntu를 실행시키기 전, docker를 실행시키기 전)에 powershell을 관리자권한으로 실행한다.

그러면 처음에 windows시스템이 예약해놓은 포트는 생각보다 적은 범위이다.

~$ netsh interface ipv4 show excludedportrange protocol=tcp

이 명령어를 컴퓨터를 부팅시킨 직후 아무 프로그램도 실행시키지 않고 쳐보면 예약된 포트가 상당히 적다는 것을 알 수 있다.

이 시점에서 2.다음 명령어를 이용해서 사용하고자하는 포트를 예약한다.

netsh int ipv4 add excludedportrange protocol=tcp startport=5432 numberofports=1 store=persistent

startport=5432 이 부분부터 numberofports=1 1개의 포트를 사용하겠다는 의미이다. 5432를 원하는 포트로 설정하고 그 이후부터 몇 개의 포트를 예약할지 numberofports=??로 설정하면 된다.

이렇게 예약을 하고 다시

~$ netsh interface ipv4 show excludedportrange protocol=tcp

명령어로 확인을 해보면 예약된 포트에 (*) 표시가 붙으면서 원하는 포트가 예약돼있는 것을 확인할 수 있다.

여기서 주의할 점은 powershell 프로그램을 우클릭해서 관리자권한으로 실행해야 포트 예약을 설정할 수 있다.

이제 ubuntu, docker를 실행시켜도 미리 포트를 사용자가 예약해 놨기 때문에 자동으로 위 프로그램들이 다른 포트를 사용하게 된다. 그러면 이제 예약된 포트는 사용자가 사용가능한 상태가 된 것이다.

출처 : (https://stackoverflow.com/questions/65272764/ports-are-not-available-listen-tcp-0-0-0-0-50070-bind-an-attempt-was-made-to/67022253#67022253) (https://pomeroy.me/2020/09/solved-windows-10-forbidden-port-bind/)
profile
Dom Hardy : 멋쟁이 개발자 되기 인생 프로젝트 진행중

2개의 댓글

comment-user-thumbnail
2022년 7월 16일

한 시간 삽질하다가 덕분에 해결했습니다 ㅠㅠ 제 생명의 은인이십니다 감사합니다

1개의 답글