WSL2, Docker desktop을 사용할 때 네트워킹 실패 문제(--net=host Option 사용 시 주의할 점)

kindof

·

2022. 9. 14. 12:08

1. 문제

WSL2 환경에서 --net=host 옵션을 바탕으로 컨테이너를 실행하게 되면, 로컬 환경에서 해당 컨테이너(서비스)의 포트로의 접근이 불가능합니다.

 

이 문제에 대해 직접 실험해보기 위해 아래와 같이 httpd 이미지를 pull 한 후, --net=host 옵션을 바탕으로 컨테이너를 동작시켜봅니다.

 

$ docker pull httpd
$ docker run -dit --name my-app --net=host -v "$PWD":/usr/local/apache2/htdocs/ httpd

그리고 아래와 같은 명령어로 컨테이너 동작을 확인하고 Request를 보내보면, 앞서 언급한 문제를 확인할 수 있습니다.

 

마찬가지로 eth0:8080에 대한 요청으로 보내도 동일한 문제가 발생합니다.

 

2. WSL2, Docker Desktop 환경에서 --net=host

아래는 https://github.com/docker/for-win/issues/6736 에서 제시한 문제에 대한 코멘트의 일부입니다.

 

 

해당 코멘트의 요지는 현재 Docker가 동작하는 환경이 WSL2 Backend에 위치하며, --net=host 옵션은 컨테이너가 동작하는 위치를 Docker가 동작하는 환경과 동일하게 둔다는 것입니다.

 

따라서, 현재 요청을 보내는 환경(Window local)과 컨테이너가 실행되는 환경(WSL2 Backend)가 다르기 때문에 위와 같은 문제가 발생했던 것입니다.

 

그래서 이 문제를 해결하기 위해서는 -p 옵션으로 포트 포워딩을 명시적으로 해주는데요. 포트를 명시적으로 바인딩해줌으로써 WSL2 Host와 Window Host가 터널링(연결)되고, 아래와 같이 요청을 성공적으로 보낼 수 있게 합니다.