친구와 Toy Project를 진행하기 위해 Window 10에 Docker Desktop을 이용하여 ubuntu 환경을 구축해 사용하였는데, 다음날 코드를 확인하기 위해 docker desktop에서 컨테이너를 실행하였으나 나타나는 화면은 docker 내부 터미널이 아닌
Cannot start service backend: Ports are not available: listen tcp 0.0.0.0:18080: bind: An attempt was made to access a socket in a way forbidden by its access permissions
메시지였다.
이럴때에는 메시지 그대로 구글링이 답이지 하고 검색을 하였는데 꽤나 자주 있었던 일인지 자료가 많았다
일단 메시지로는 포트를 사용하지 못한다는 소리인데 분명 생성하고 나서는 제대로 실행이 되었을텐데?
우선적으로 내가 사용할 수 있는 포트를 확인해보았다.
powershell에서
netsh interface ipv4 show excludedportrange protocol=tcp
을 사용하여 확인이 가능했다.
(문제를 해결하고 작성하는 탓에 보이는 화면과는 달랐다. 이 화면에서는 8081부터 8180까지도 사용하지 못한다!)
위의 화면으로는 시작-끝 포트까지는 사용하지 못 한다는 이야기였다.
그럼 매번 컨테이너를 새로 생성해야하나? 싶었지만
사용자가 사용할 포트를 미리 예약을 해두어 다른 프로그램이 사용하지 못하게 할 수 있다는 글을 보았다.
(출처: https://velog.io/@dom_hxrdy/Cannot-start-service-backend-Ports-are-not-available-listen-tcp-0.0.0.03001-bind-An-attempt-was-made-to-access-a-socket-in-a-way-forbidden-by-its-access-permissions.-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0)
위의 포스트에서 사용한 방법은 2번이다.
1. 우선적으로 Docker Desktop의 자동 실행을 비활성화 시킨다.
2. 이후 재부팅 후 아래 명령어를 확인하여 사용가능한 포트를 확인한다.
netsh interface ipv4 show excludedportrange protocol=tcp
다행이 내가 사용할 포트는 포함되어 있지 않았다.
3. 내가 사용할 포트를 예약한다
netsh int ipv4 add excludedportrange protocol=tcp startport=[port] numberofports=1 store=persistent
자세한 사용법은 아래와 같다.
난 18080, 18090, 10022을 사용할 것이기 때문에
netsh int ipv4 add excludedportrange protocol=tcp startport=18080 numberofports=1 store=persistent
netsh int ipv4 add excludedportrange protocol=tcp startport=18090 numberofports=1 store=persistent
netsh int ipv4 add excludedportrange protocol=tcp startport=10022 numberofports=1 store=persistent
을 실행시켜주었다.
이런 단순 반복적인 명령어는 보기 좋지 않은데 다른 방법이 있지 않을까 싶다.
이후 다시 포트를 확인해 보면
와 같이 사용할 포트가 제외되어 있는 것을 확인할 수 있다.
이제 container를 실행시켜보면 잘 된다!
powershell을 관리자 권한으로 실행시키지 않는다면 예약이 안되므로 참고해야 한다!