일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- LSTM
- torch.nn.Module
- 파이썬문법
- 가상환경
- Anaconda
- 딥러닝
- objectdetection
- ViT
- Torchvision
- AI
- vision transformer
- 머신러닝
- 파이썬
- rnn
- __init__
- __call__
- pychram
- pip install
- CNN
- DeepLearning
- python
- python 문법
- tensorflow
- wsl2
- 가상환경구축
- docker
- ubuntu
- pytorch
- Deep learning
- torch.nn
- Today
- Total
인공지능을 좋아하는 곧미남
[Docker] WSL2-ubuntu DNS nameserver 주소 오류 인터넷 연결 문제 본문
아래와 같이 docker에 접속해서 apt-get update를 수행하니 error가 발생했다.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease Temporary failure resolving 'security.ubuntu.com' W: Failed to fetch https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/InRelease Temporary failure resolving 'developer.download.nvidia.com' W: Failed to fetch https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/dists/jammy/InRelease Temporary failure resolving 'ppa.launchpadcontent.net'
오류 내용을 찾아보면, DNS 문제로 인해서 인터넷 연결이 원활하지 않다고 나온다.
일단, 해결하는데는 docker run —dns 8.8.8.8 을 추가하면 해결이 되었다.
그런데, 정확한 이유나 원인을 좀 더 살펴봐야할듯.
nslookup 명령어에서 "no servers could be reached"와 "communications error" 메시지는 네임서버에 접근할 수 없거나 네임서버와의 통신이 실패했음을 나타냅니다. 이 문제는 다음과 같은 원인으로 발생할 수 있습니다:
1. 원인:
- 잘못된 DNS 설정: 컨테이너나 WSL 환경의 DNS 설정이 잘못되었을 수 있습니다. 보통 /etc/resolv.conf 파일에 설정된 DNS 서버가 올바르지 않을 때 발생합니다.
- 네트워크 연결 문제: WSL 환경 또는 Docker 컨테이너 내에서 네트워크 연결이 불안정하거나 외부 네트워크와의 연결이 차단되었을 수 있습니다.
- 네임 서버 접근 불가: 설정된 DNS 서버(10.255.255.254)와의 통신이 불가능하거나 해당 서버가 동작하지 않고 있을 수 있습니다.
즉, nameserver DNS 서버(10.255.255.254) 주소가 통신이 되지 않아 /etc/resolv.conf에서 nameserver 8.8.8.8로 수정을 하면 docker를 build할때 인터넷 연결이 되어 작동이 됨.
근데 wsl —shutdown 후 wsl로 재 접속하면, /etc/resolv.conf의 nameserver가 10.255.255.254로 초기화 되어 있음. wsl이 시작될때, nameserver 8.8.8.8로 맞추는 서비스를 등록해버림.
2. 시스템 서비스 이용
위 방법으로 해결이 안 될 경우, WSL 시작 시 /etc/resolv.conf에 nameserver 8.8.8.8을 추가하는 스크립트를 만들어서 시스템 서비스로 추가할 수 있습니다. 다만, 위 방법이 더 간단하고 추천되는 방식입니다.
- 스크립트 생성
그리고 다음 내용을 추가합니다:스크립트 파일에 실행 권한을 부여합니다:sudo nano /usr/local/bin/set_dns.sh
- sudo chmod +x /usr/local/bin/set_dns.sh
- #!/bin/bash echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
- /usr/local/bin/set_dns.sh라는 스크립트를 생성합니다:
- 시스템 서비스 파일 생성
다음 내용을 추가합니다:sudo vi /etc/systemd/system/set_dns.service :wq 저장
- [Unit] Description=Set DNS for WSL After=network.target [Service] ExecStart=/usr/local/bin/set_dns.sh Type=oneshot RemainAfterExit=true [Install] WantedBy=multi-user.target
- /etc/systemd/system/set_dns.service 파일을 생성합니다:
- 서비스 활성화 및 시작
sudo systemctl enable set_dns.service sudo systemctl start set_dns.service
- 새로 만든 서비스를 활성화하고, 부팅 시 자동으로 실행되도록 설정합니다:
이렇게 하면 WSL 시작 시마다 자동으로 /etc/resolv.conf에 nameserver 8.8.8.8이 추가되도록 설정할 수 있습니다.
이 서비스 파일과 스크립트 파일의 동작을 설명드리겠습니다.
service 파일 설명
[Unit]
Description=Set DNS for WSL
After=network.target
- Description: "Set DNS for WSL"라는 설명을 가진 서비스입니다. 이 서비스는 WSL(Windows Subsystem for Linux)에서 DNS 설정을 적용하는 역할을 합니다.
- After=network.target: 이 서비스는 네트워크가 활성화된 후에 실행됩니다. 네트워크가 준비된 후에 DNS 설정을 적용하는 것이 필요하기 때문에 이 옵션이 설정되었습니다.
[Service]
ExecStart=/usr/local/bin/set_dns.sh
Type=oneshot
RemainAfterExit=true
- ExecStart: /usr/local/bin/set_dns.sh 스크립트를 실행합니다. 이 스크립트가 서비스가 실행될 때 수행할 동작을 정의합니다.
- Type=oneshot: 이 서비스는 단일 실행 작업입니다. set_dns.sh 스크립트가 한 번 실행되고 종료됩니다. 이후, 서비스가 계속해서 백그라운드에서 동작하지 않습니다.
- RemainAfterExit=true: 스크립트가 종료된 후에도 서비스가 "활성 상태"로 남아있도록 설정합니다. 즉, set_dns.sh가 실행을 완료해도 이 서비스는 여전히 활성화된 상태로 표시됩니다.
[Install]
WantedBy=multi-user.target
- WantedBy=multi-user.target: 이 서비스는 다중 사용자 모드(일반적인 부팅 모드)에서 활성화될 수 있습니다. multi-user.target은 텍스트 기반의 사용자 모드로, GUI가 필요하지 않은 대부분의 서버에서 사용됩니다.
set_dns.sh 스크립트 설명
#!/bin/bash
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
- #!/bin/bash: 이 스크립트가 Bash 셸에서 실행된다는 것을 지정합니다.
- echo "nameserver 8.8.8.8": nameserver 8.8.8.8이라는 내용을 출력합니다. 여기서 8.8.8.8은 Google의 DNS 서버입니다.
- sudo tee /etc/resolv.conf > /dev/null: echo 명령의 출력 내용을 /etc/resolv.conf 파일에 쓰기 위해 tee 명령을 사용합니다. /etc/resolv.conf는 DNS 서버 정보를 저장하는 파일입니다. sudo를 사용하여 관리자 권한으로 파일을 쓰며, > /dev/null은 명령어의 출력을 화면에 표시하지 않도록 합니다.
전체적인 동작 요약
- 이 서비스는 네트워크가 활성화된 후 실행됩니다.
- /usr/local/bin/set_dns.sh 스크립트가 실행되어 /etc/resolv.conf 파일에 nameserver 8.8.8.8이라는 DNS 설정을 작성합니다.
- 스크립트가 실행된 후, 서비스는 더 이상 백그라운드에서 실행되지 않지만, RemainAfterExit=true 설정에 의해 서비스 상태는 계속 "활성"으로 남아 있습니다.
'Docker' 카테고리의 다른 글
[Docker] Nvidia 이미지 컨테이너 생성 (0) | 2024.11.22 |
---|---|
[Docker] Docker container 다른 서버로 옮기기 (0) | 2024.11.22 |
[Docker] 자주 쓰는 명령어 및 파라미터 역할 (0) | 2024.11.22 |
[Docker] AI 개발자로서 Docker의 필요성 (1) | 2022.12.20 |