Docker Desktop, IntelliJ 그리고 Hyper-V

zuckerfrei·2023년 4월 24일
0

에러가 퐝퐝 터진 날이었다. 정리가 안 되서 일단 시간 순서대로 적는다.

1. Docker Desktop

가장 먼저 말썽을 일으킨건 docker desktop이었다.

평소처럼 실행시켰는데 아래와 같은 에러가 나오면서 작동하지 않았다.

an unexpected error was encountered while executing a wsl command. 
common causes include access rights issues, which occur after waking the computer or not being connected to your domain/active directory.

지금까지 v4.15.0버전을 사용 중이었는데, 최신 버전으로 업데이트 하면 괜찮아질까 싶었는데 소용이 없었다.
그리고 삭제/재설치/재부팅을 아무리 해봐도 같은 에러가 발생했다.

Github issue 댓글 중 다음과 같은 명령어를 실행시킨 후 재시작하니 정상적으로 작동하기 시작했다.

PS C:\WINDOWS\system32> netsh winsock reset

Winsock 카탈로그를 원래대로 설정했습니다.
원래대로 설정 작업을 완료하려면 컴퓨터를 다시 시작해야 합니다.

소켓을 초기화하는 명령어라고 하는데, 초기화 하면서 뭔가 꼬인 것이 다시 풀렸나 싶었다.

2. IntelliJ

이러고 집에 와서 IntelliJ를 켰는데 당황스럽게도 아래와 같은 에러가 발생했다.

Internal error. Please refer to https://jb.gg/ide/critical-startup-errors

java.net.BindException: Address already in use: bind
    at java.base/sun.nio.ch.Net.bind0(Native Method)
    at java.base/sun.nio.ch.Net.bind(Net.java:555)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:506)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:491)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)

-----
Your JRE: 17.0.5+1-b653.23 amd64 (JetBrains s.r.o.)
C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\jbr

..???
그저 인텔리제이를 실행시키기만 했는데, 이미 사용 중인 포트라는 에러가 나온다.

구글에 검색해보니 나와 같은 에러가 발생한 사람들이 있었다.
참조1, 참조2, 참조3

글을 읽어보니 원인은 에러 로그에서 나타난 것 처럼 중복된 포트를 사용하려는 것이었다.
windows 부팅시 Hyper-V가 포트를 몇 개 미리 점유해서 사용or사용준비를 하는데,
이 포트들이 IntelliJ가 사용하는 포트와 겹친 상황으로 보인다.

그래서 나도 다른 사람들처럼 명령어 3줄을 입력하면 해결될 것이라 생각했다.

  1. Hyper-V 비활성화. 재부팅 필요
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
  1. Hyper-V가 특정 포트(50051)를 미리 점유하지 않도록 설정. (그런데 왜 50051포트인지?? 50051을 검색해도 잘 모르겠다)
netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1
  1. Hyper-V를 재시작. 재부팅 필요
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

1번은 정상적으로 실행되었으나, 2번에서 이슈가 있었다.
"다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다."

C:\Windows\System32>netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1
다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다.

C:\Windows\System32>dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

배포 이미지 서비스 및 관리 도구
버전: 10.0.22621.1

이미지 버전: 10.0.22621.1555

기능을 사용하도록 설정하는 중
[==========================100.0%==========================]
작업을 완료했습니다.
이 작업을 완료하려면 Windows를 다시 시작해야 합니다.
지금 컴퓨터를 다시 시작하시겠습니까? (Y/N)

50051포트가 사용중이라 액세스 할 수 없는 것으로 보인다.
2번째 명령어가 먹히지 않으니 아무리 hyper-v를 다시 활성화 시켜도 에러는 해결되지 않았다.


그래서 hyper-V가 잡고 있는 포트를 확인해보았다.

예약된 TPC포트 범위를 확인하는 명령어

netsh interface ipv4 show excludedportrange protocol=tcp
C:\Windows\System32>netsh interface ipv4 show excludedportrange protocol=tcp

프로토콜 tcp 포트 제외 범위

시작 포트    끝 포트
----------    --------
      6942        6951     *
     50000       50059     *

* - 관리 포트 제외입니다.

50051이 이미 예약되어있어서 위의 2번째 명령어가 먹히지 않은 것 같았다.

다른 사람들이 해결한 방법대로 하지 않았는데도, 재부팅을 하니 IntelliJ는 다시 정상적으로 돌아왔다..
그런데 다시 Docker Desktop은 맛탱이가 가버렸다. 심지어 맨 처음에 나타났던 그 에러로


3. 다시 Docker Desktop

다시 1번의 상황으로 돌아와버렸다.
IntelliJ - 정상, Docker Desktop - 비정상

재부팅, hyper-V 비활성화, VMware 삭제, Docker 재설치, WSL 재설치 등등 온갖 삽질을 다 했는데도 Docker Desktop은 여전히 동일한 상태였다.

WSL 삭제하기

C:\Windows\System32>wslconfig.exe /l
Linux용 Windows 하위 시스템 배포:
docker-desktop(기본값)

C:\Windows\System32>wslconfig.exe /u docker-desktop
등록 취소 중입니다.
작업을 완료했습니다.

C:\Windows\System32>wslconfig.exe /l
Linux용 Windows 하위 시스템에 설치된 배포판이 없습니다.

'wsl.exe --list --online'를 사용하여 사용 가능한 배포판을 나열하고
'wsl.exe --install <Distro>'를 사용하여 설치하세요.

배포판은 Microsoft Store
(https://aka.ms/wslstore)를
방문하여 설치할 수도 있습니다.
Error code: WslConfig/WSL_E_DEFAULT_DISTRO_NOT_FOUND



그러다가 정말 자포자기한 심정으로 Docker Desktop 설치할 때
Use WSL 2 instead of Hyper-V(recommend 옵션)을 해제하고 설치했더니 정상적으로 실행이 되더라...


알고 해결한게 아니라 어쩌다가 해결 되었다. 이러다가 언제 또 에러를 뱉을지 몰라서 불안하다.

Hyper-V와 WSL 도커 때문에 이름과 대략적인 설명만 보고 넘어갔는데 그냥 넘어갈 애들이 아닌 것 같다.
다음 글에서는 이 두 가지를 공부해보고 정리해봐야겠다.

profile
무설탕 음료를 좋아합니다

2개의 댓글

comment-user-thumbnail
2023년 7월 16일

저도 동일증상으로 아주 설사를 벽에 퍼바르다가 ... 하아...

1개의 답글