이전에 작동했던 다양한 파일에서 Docker 빌드를 실행하려고 시도했지만 이제는 더 이상 작동하지 않습니다.
Docker 파일에 소프트웨어를 설치할 줄이 포함 되 자마자 패키지를 찾을 수 없다는 메시지와 함께 실패합니다.
RUN apt-get -y install supervisor nodejs npm
로그에 나타난 일반적인 메시지는
Could not resolve 'archive.ubuntu.com'
소프트웨어가 설치되지 않는 이유를 아십니까?
답변
의 주석 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"에 /etc/default/docker로 매트 캐리어가 제안하는 것은 않았다 NOT 나를 위해 작동합니다. 또한 회사의 DNS 서버를 해당 파일에 넣지 않았습니다. 그러나 다른 방법이 있습니다 (계속 읽으십시오).
먼저 문제를 확인하겠습니다.
$ docker run --rm busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
명령이 중단 된 것처럼 보이지만 결국 ” ‘google.com’을 해결할 수 없습니다.”라는 오류가 나오면 저와 같은 문제가있는 것입니다.
이 nslookup명령은 ‘google.com’의 텍스트 주소를 IP 주소로 바꾸기 위해 DNS 서버 8.8.8.8을 쿼리합니다. 아이러니하게도 8.8.8.8은 Google의 공개 DNS 서버 입니다. 경우 nslookup실패 8.8.8.8 같은 공공 DNS 서버는 귀하의 회사에 의해 차단 될 수 있습니다 (I 보안상의 이유로 가정).
당신은 당신의 회사의 DNS 서버를 추가하는 것을 생각할 것 DOCKER_OPTS에서하는 /etc/default/docker트릭을 할해야하지만, 어떤 이유, 그것은 나를 위해 일을하지 않았다. 나는 아래에서 나를 위해 일한 것을 설명합니다.
해결책 :
호스트 (Ubuntu 16.04를 사용하고 있음)에서 기본 및 보조 DNS 서버 주소를 찾습니다.
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
이 주소를 사용하여 파일을 만듭니다 /etc/docker/daemon.json.
$ sudo su root
# cd /etc/docker
# touch daemon.json
이것을 넣으십시오 /etc/docker/daemon.json:
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
루트에서 종료 :
# exit
이제 docker를 다시 시작하십시오.
$ sudo service docker restart
확인 :
이제 /etc/docker/daemon.json파일 을 추가하면 ‘google.com’을 IP 주소로 확인할 수 있는지 확인합니다 .
$ docker run --rm busybox nslookup google.com
Server: 10.0.0.2
Address 1: 10.0.0.2
Name: google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
참조 :
저는 솔루션에 대한 모든 공로를 인정받을 자격이있는 Robin Winslow의 기사를 기반으로 솔루션을 기반으로했습니다. 고마워, 로빈!
“Docker의 네트워킹 DNS 구성 수정.” 로빈 윈 슬로우. 2016 년 11 월 9 일에 확인 함. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
답변
많은 두통 끝에 나는 답을 찾았습니다. Could not resolve 'archive.ubuntu.com'다음과 같이 변경하여 수정할 수 있습니다.
-
다음 줄의 주석 처리를 제거하십시오.
/etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" -
Docker 서비스 다시 시작
sudo service docker restart -
잘못된 DNS 설정을 캐시 한 이미지를 삭제하십시오.
- 다시 빌드하면 문제가 해결되어야합니다.
크레딧은 Andrew SB 에게갑니다.
답변
같은 문제가 발생하지만 / etc / default / docker dns 항목의 주석 처리를 제거 하거나 빌드 컨테이너에서 /etc/resolv.conf 를 편집 하거나 /etc/docker/daemon.json 이 도움이됩니다.
하지만 –network = host 옵션을 사용하여 빌드 한 후 다시 해결되었습니다.
docker build --network=host -t my-own-ubuntu-like-image .
아마도 이것은 누군가를 다시 도울 것입니다.
답변
Matt Carrier의 답변 이이 문제에 대한 올바른 해결책 이라고 생각합니다 . 그러나 구현 한 후에도 동일한 동작을 관찰했습니다 could not resolve 'archive.ubuntu.com'..
이로 인해 결국 연결된 네트워크가 공용 DNS를 차단하고 있음을 알게되었습니다. 이 문제에 대한 해결책은 내 호스트 (Docker를 실행하는 시스템)가 사용하는 것과 동일한 이름 서버를 사용하도록 Docker 컨테이너를 구성하는 것이 었습니다.
분류 방법 :
- Docker 문서를 통해 작업하고 있었기 때문에 이미 내 컴퓨터에 예제 이미지가 설치되어있었습니다. 새 컨테이너를 시작하여 해당 이미지를 실행하고 해당 컨테이너에 새 bash 세션을 만들 수있었습니다.
docker run -it docker/whalesay bash - 컨테이너가 인터넷에 연결되어 있습니까? :
ping 172.217.4.238(google.com) - 컨테이너가 호스트 이름을 확인할 수 있습니까?
ping google.com
제 경우에는 첫 번째 ping는 응답을, 두 번째는 그렇지 않았습니다.
수정 방법 :
DNS가 컨테이너 내부에서 작동하지 않는다는 사실을 알게되자 호스트에서 동일한 동작을 복제 할 수 있는지 확인했습니다. nslookup google.com호스트에서 잘 해결되었습니다. 그러나, nslookup google.com 8.8.8.8또는 nsloookup google.com 8.8.4.4시간이 초과되었습니다.
다음으로 nm-tool(Ubuntu 14.04에서) 실행하여 호스트가 사용하고있는 이름 서버를 찾았습니다 . 빠른 피드백의 맥락에서 예제 이미지를 다시 시작하고 컨테이너의 resolv.conf 파일에 이름 서버의 IP 주소를 추가했습니다 sudo vi /etc/resolv.conf.. 일단 저장되면 다시 핑 ( ping google.com)을 시도했고 이번에는 작동했습니다!
컨테이너의 resolv.conf에 대한 변경 사항은 영구적이지 않으며 컨테이너를 다시 시작하면 손실됩니다. 필자의 경우 더 적절한 해결책은 네트워크 이름 서버의 IP 주소를 호스트 /etc/default/docker파일 에 추가하는 것이 었습니다 .
답변
로컬 dns ip를 기본 도커 파일에 추가하면 저를 위해 작동하기 시작했습니다 … 아래 단계를 찾으십시오 …
$ nm-tool # (will give you the dns IP)
DNS : 172.168.7.2
$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"
$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)
$ docker rmi $(docker images -q) # (remove all the images)
$ service docker restart #(restart the docker to pick up dns setting)
이제 Docker를 빌드하십시오 … 🙂
답변
이 문제가있는 사람을 위해 /etc/default/docker다른 답변과 질문에서 제안한대로 파일 을 편집하여 문제를 해결했습니다 . 그러나 나는 DNS로 사용할 IP를 몰랐습니다.
ifconfig docker도커 네트워크 인터페이스에 대한 IP를 표시하기 위해 호스트에서 실행해야한다는 사실을 알게 된 것은 잠시 후였습니다 .
docker0 Link encap:Ethernet Endereço de HW 02:42:69:ba:b4:07
inet end.: 172.17.0.1 Bcast:0.0.0.0 Masc:255.255.0.0
endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)
그것은이었다 172.17.0.1내 경우. 이 문제가있는 모든 사람에게 도움이되기를 바랍니다.
답변
나는 구글링 후에이 대답 을 찾았다. Windows를 사용하고 있으므로 위의 답변 중 일부가 내 파일 시스템에 적용되지 않았습니다.
기본적으로 실행 :
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
8.8.8.8내가 믿고 사용하는 기존 네임 서버를 덮어 씁니다 . 그것은 나를 위해 일했습니다!
일부 의견에 따르면 루트 여야 할 수도 있습니다. 그렇게하려면 sudo -i.
