WSL(Windows Subsystem for Linux)을 사용할 때 Docker 컨테이너 내부에서 외부 네트워크에 접근할 수 없는 문제가 발생했습니다. 이 문제는 WSL과 Docker의 네트워크 구조 및 설정에서 비롯된 것이며, DNS 문제와 네트워크 브릿지 충돌 등이 원인일 수 있습니다.
문제의 원인과 개념을 자세히 설명하고, 이를 해결하는 방법을 차근차근 소개하겠습니다.
1. 🌐 문제의 원인 분석
1.1 WSL 네트워크 환경의 특징
WSL2는 Windows 내부에서 동작하는 가상화된 Linux 환경으로, 기본적으로 Windows 호스트 네트워크를 통해 인터넷에 연결됩니다.
WSL2와 Docker 간의 네트워크 설정이 서로 충돌하거나 호환되지 않으면 다음 문제가 발생할 수 있습니다.
- Docker 컨테이너에서 외부 네트워크에 접근하지 못함.
- WSL과 Docker 사이의 네트워크가 단절됨.
1.2 네트워크 브릿지 설정 문제
Docker는 기본적으로 bridge 네트워크를 사용하여 컨테이너 간 통신 및 외부 네트워크 연결을 관리합니다.
WSL2와 Docker가 사용하는 네트워크 인터페이스가 충돌하면 문제가 발생할 수 있습니다.
🛠 네트워크 브릿지란?
네트워크 브릿지는 컨테이너와 호스트 간의 통신, 컨테이너 간 통신, 외부 네트워크 연결을 가능하게 해주는 가상 네트워크입니다.
브릿지가 제대로 설정되지 않으면:
- 컨테이너가 외부 네트워크(인터넷)에 접근할 수 없음.
- Docker와 WSL 사이의 네트워크가 단절됨.
1.3 DNS 설정 문제
컨테이너 내부에서 도메인 이름을 해석하려면 DNS 서버를 통해 도메인을 IP 주소로 변환해야 합니다.
WSL2 환경에서 Docker는 다음과 같은 이유로 DNS 문제를 겪을 수 있습니다.
- WSL이 자동 생성한
resolv.conf
파일에 설정된nameserver
가 WSL 내부 DNS를 참조하지만, 컨테이너는 이를 사용할 수 없음. - Docker의 기본 DNS 설정이 WSL 네트워크와 충돌하거나, DNS 요청이 무한 순환되는 상황 발생.
1.4 resolv.conf
파일의 문제 (저는 이 문제였습니다.)
WSL2에서 /etc/resolv.conf
파일은 다음과 같이 자동 생성됩니다.
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.17.176.1
- 172.17.176.1: WSL 내부에서 생성된 가상 네트워크 인터페이스 주소입니다.
- 이 주소는 WSL 내부에서는 유효하지만, Docker 컨테이너에서는 접근 불가능할 수 있습니다.
- WSL과 Docker 간 네트워크 네임스페이스가 분리되어 있기 때문입니다.
1.5 방화벽/네트워크 규칙 문제
Windows 방화벽이 WSL과 Docker 사이의 네트워크 요청을 차단할 수도 있습니다.
- 예를 들어, WSL과 Docker의 네트워크 트래픽이 차단되면 DNS 요청이 실패하거나 네트워크 연결이 끊어질 수 있습니다.
2. 🛠 해결 방법: 단계별로 문제 해결하기
2.1 WSL의 DNS 자동 생성 비활성화
WSL이 자동으로 생성하는 /etc/resolv.conf
파일을 비활성화하고, 직접 DNS 설정을 추가합니다.
설정 방법:
/etc/wsl.conf
파일 수정:[network] generateResolvConf = false
- WSL 재시작:
wsl --shutdown
- DNS 설정 파일 생성:아래 내용을 추가합니다:
nameserver 8.8.8.8 nameserver 8.8.4.4
sudo nano /etc/resolv.conf
이유:
- Google Public DNS(
8.8.8.8
)를 명시적으로 사용하여 DNS 요청이 실패하지 않도록 설정합니다.
2.2 Docker 데몬 설정 수정(저는 이 방법을 사용했습니다.)
Docker가 사용할 DNS 서버와 네트워크 주소 범위를 명시적으로 설정합니다.
설정 파일 경로:
/etc/docker/daemon.json
설정 내용:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"default-address-pools": [
{
"base": "192.168.1.0/24",
"size": 24
}
]
}
각 항목 설명:
dns
: 컨테이너가 사용할 DNS 서버를 명시.default-address-pools
: Docker 네트워크의 IP 주소 범위를 명시하여 WSL 네트워크와의 충돌 방지.
Docker 서비스 재시작:
sudo service docker restart
2.3 네트워크 브릿지 확인 및 수정
Docker 네트워크 설정을 확인하고, 브릿지 네트워크를 조정합니다.
Docker 네트워크 확인:
docker network ls
- 브릿지 네트워크(
bridge
)가 활성화되어 있는지 확인합니다.
IP 충돌 방지:
Docker의 IP 풀을 재설정했으므로 브릿지가 올바르게 작동하지 않을 경우 아래 명령어로 네트워크를 재설정합니다.
docker network prune
2.4 방화벽 규칙 확인
Windows 방화벽에서 WSL과 Docker 관련 트래픽이 허용되도록 설정합니다.
2.5 DNS 캐시 초기화
WSL에서 DNS 캐시를 초기화하여 이전의 잘못된 DNS 설정을 제거합니다.
sudo resolvectl flush-caches
3. ✨ 정리
- 문제 원인:
- WSL의 자동 생성 DNS 설정이 Docker 컨테이너에서 동작하지 않음.
- Docker와 WSL 네트워크 충돌로 DNS 요청 실패.
- 방화벽 규칙 및 네트워크 브릿지 설정 문제.
- 해결 방법:
- WSL의
/etc/resolv.conf
파일을 비활성화하고, 명시적인 DNS 설정 추가. - Docker 데몬 설정(
/etc/docker/daemon.json
)에 DNS와 네트워크 주소 범위를 명시. - Windows 방화벽 규칙 확인 및 수정.
- WSL의
- 적용 후 테스트:
- Docker 컨테이너에서 외부 네트워크에 정상적으로 연결되는지 확인합니다:
docker run --rm alpine ping -c 3 google.com
- Docker 컨테이너에서 외부 네트워크에 정상적으로 연결되는지 확인합니다:
위 과정을 차근차근 따라 하면, WSL 환경에서 Docker 컨테이너가 외부 네트워크에 접근하지 못하는 문제를 확실히 해결할 수 있습니다. 🚀
'IT 지식' 카테고리의 다른 글
[Linux] 리눅스 환경에서 sudo 권한 실행 시 비밀번호를 묻지 않도록 설정하는 방법 (0) | 2024.11.25 |
---|---|
[Jenkins] Jenkins Docker 컨테이너에서 Docker를 사용해 Git 소스 배포하기 (2) | 2024.11.16 |
WSL(Windows Subsystem for Linux)에서 SSH 설정하기 (10) | 2024.11.14 |
[Kubernetes] 쿠버네티스(Kubernetes)란 무엇인가 (2) | 2024.11.12 |
[Jenkins] Jenkins에서 GitHub 및 GitLab 인증 연동하기 (0) | 2024.11.09 |