[docker] Docker 빌드“ ‘archive.ubuntu.com’을 해결할 수 없습니다.”apt-get이 아무것도 설치하지 못함

이전에 작동했던 다양한 파일에서 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'다음과 같이 변경하여 수정할 수 있습니다.

  1. 다음 줄의 주석 처리를 제거하십시오. /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Docker 서비스 다시 시작
    sudo service docker restart

  3. 잘못된 DNS 설정을 캐시 한 이미지를 삭제하십시오.

  4. 다시 빌드하면 문제가 해결되어야합니다.

크레딧은 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 컨테이너를 구성하는 것이 었습니다.

분류 방법 :

  1. Docker 문서를 통해 작업하고 있었기 때문에 이미 내 컴퓨터에 예제 이미지가 설치되어있었습니다. 새 컨테이너를 시작하여 해당 이미지를 실행하고 해당 컨테이너에 새 bash 세션을 만들 수있었습니다.docker run -it docker/whalesay bash
  2. 컨테이너가 인터넷에 연결되어 있습니까? : ping 172.217.4.238(google.com)
  3. 컨테이너가 호스트 이름을 확인할 수 있습니까? 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.