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


101

이전에 작동했던 다양한 파일에서 Docker 빌드를 실행하려고 시도했지만 이제는 더 이상 작동하지 않습니다.

Docker 파일에 소프트웨어를 설치할 줄이 포함 되 자마자 패키지를 찾을 수 없다는 메시지와 함께 실패합니다.

RUN apt-get -y install supervisor nodejs npm

로그에 나타난 일반적인 메시지는

Could not resolve 'archive.ubuntu.com'

소프트웨어가 설치되지 않는 이유를 아십니까?


이것은 컴퓨터가 인터넷에서 연결이 끊어 질 때 발생합니다 ... 나는 newgrp docker전체 로그 오프를 수행하는 대신 발행 한 다음 나 자신을 부여한 후 로그인하는 경우에만 새로운도 커가 설치된 Linux 랩톱에서 발생 하는 것을 보았습니다 sudo usermod -aG docker myuserid... 그러나 그것은 발생합니다
Scott Stensland

답변:


250

의 주석 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/


3
변경 후 서비스를 시작할 수 없다는 오류가 발생했습니다. / etc / default / docker 및 /etc/init.d/docker에서 DOCKER_OPTS를 수정했기 때문입니다. 고정 표시기 서비스의 시작 문제 변경 사항을 해결 되돌리기
Twiebie

7
이것은 (회사 네트워크에서) 나를 위해 일했지만 수락 된 솔루션은 그렇지 않았습니다.
David Ebbo

1
이것은 허용 된 솔루션이 그렇지 않은 동안 저에게도 효과적이었습니다. nslookup을 사용하여 nmcli는 아니지만 DNS 서버 IP를 얻었습니다.
Necro

2
daemon.json도 나를 위해 작동합니다! 그리고이 명령으로 회사가 8.8.8.8을 차단했는지 확인할 수 있습니다 nslookup google.com 8.8.8.8. 제 경우에는이 오류가 발생했습니다connection timed out; no servers could be reached
ROTOGG

3
/etc/default/docker일부 사람들에게 효과가 없었던 이유 는 (파일에서 주석을 인용)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski

88

많은 두통 끝에 나는 답을 찾았습니다. 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 에게갑니다.


7
오히려 이렇게하지 않는 게 좋을 경우 당신은 또한 위 = # 3 사실 --no-캐시를 추가 할 수 있습니다
jschorr

8
이것은 나를 위해 작동하지 않으며 이유를 모릅니다. 나는 몇 주 동안 이것을 켜고 끌었다.
Corey Ogburn 2015

2
나는 리눅스 민트에서 실행 중이므로 boot2docker가 없습니다. / etc / default / docker가 생성되고 위에 DOCKER_OPTS 플래그가 있습니다. 서비스를 다시 시작하고 모든 이미지와 컨테이너를 지 웠지만 여전히 아무것도 지 웠습니다.
Corey Ogburn 2015

2
@CoreyOgburn 나는 또한 jschorr가 위에서 언급했듯이 --no-cache = true를 시도 할 것입니다. 예 :docker build --no-cache=true ...
Matt Carrier

6
나는 달렸 docker build --no-cache=true -t docker-whale .지만 다른 일이 없었던 것 같습니다.
Corey Ogburn

46

같은 문제가 발생하지만 / etc / default / docker dns 항목의 주석 처리를 제거 하거나 빌드 컨테이너에서 /etc/resolv.conf 를 편집 하거나 /etc/docker/daemon.json 이 도움이됩니다.

하지만 --network = host 옵션을 사용하여 빌드 한 후 다시 해결되었습니다.

docker build --network=host -t my-own-ubuntu-like-image .

아마도 이것은 누군가를 다시 도울 것입니다.


오랫동안 "archive.ubuntu.com:80(xxxx)에 연결할 수 없습니다.-연결 (111 : 연결이 거부 됨)"라는 다른 오류가 발생했으며 --network = host를 사용하는 것이 이제 수정되었음을 발견했습니다. 내 문제
에릭 Arseneau

수많은 문제 해결 후 이것이 나를 위해 일한 유일한 것입니다.
math0ne

15

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파일 에 추가하는 것이 었습니다 .


2
주소 이름 서버를 가져 오는 구체적인 명령 : nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) 및 nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). 신용 : Marty Fried .
r0estir0bbe

이것은 더 광범위한 답변입니다. 사무실 네트워크로 전환하거나 네트워크가 변경 될 때 항상 문제가 있습니다. 회사의 DNS 서버를 추가하면 조회 문제가 해결됩니다.
gvd

1
매우 교육적입니다! 문제를 확인한 다음 수정 사항을 제공하고 수정 사항이 작동하는지 확인하는 방법을 보여주는 답변을 찾는 경우는 거의 없습니다. 훌륭한 문제 해결!
Matthew Kraus 2016

이봐, 좀 도와 줄래? 동일한 문제가 있지만 호스트는 도커 컨테이너를 실행하고 거기에서 Ubuntu 이미지를 구성하려는 Windows 시스템입니다. 여기서 이름 서버라고하면 내 Windows 컴퓨터의 DNS 서버 주소를 의미합니까? 그리고 그것도 1 차적인 것입니까, 2 차적인 것입니까?
CodeHunter

이것은 우리 조직이 퍼블릭 DNS를 차단하고 DOCKER_OPTS 아래의 / etc / default / docker에서 조직의 DNS를 설정하고 문제가 해결 될 때 직면 한 정확한 문제입니다. 모두가이 대답을 환영합니다 ...
skm

7

로컬 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를 빌드하십시오 ... :)


7

이 문제가있는 사람을 위해 /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내 경우. 이 문제가있는 모든 사람에게 도움이되기를 바랍니다.


7
당신이 당신의 고정 표시기 파일을 편집하는 방식 지정된 경우 도움이 될 것입니다
physincubus을

1
Ubuntu 18.04에서 :ifconfig docker0
automorphic

6

나는 구글링 후에이 대답 을 찾았다. Windows를 사용하고 있으므로 위의 답변 중 일부가 내 파일 시스템에 적용되지 않았습니다.

기본적으로 실행 :

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

8.8.8.8내가 믿고 사용하는 기존 네임 서버를 덮어 씁니다 . 그것은 나를 위해 일했습니다!

일부 의견에 따르면 루트 여야 할 수도 있습니다. 그렇게하려면 sudo -i.


ssh존재하지 않기 때문에 Windows 10에서 작동하지 않았습니다.
Seanny123

@ Seanny123 나는 이것으로 무엇이든 한 지 오래되었지만 Windows 10도 사용했습니다. 당시에 이전 Docker Toolbox 를 사용하고 있었을 수 있습니까? 그렇지 않으면 Windows SSH 클라이언트활성화 해야 할 수 있습니다 . 나는 아마 그것으로 시작할 것입니다.
Engineero

1
내가 루트 sudo -i가 된
후이

5

검색 엔진에서이 문제를 접하는 모든 사람에게 늦은 응답을 추가하고 싶었습니다.

이 작업을 수행하지 마십시오. / etc / default / docker에를 설정하는 옵션이있었습니다 iptables=false. 이 UFW 일을하지 않았기 때문에 (모든 비록 단지 3 포트가 허용되었다 연) 나는 맹목적으로이 질문에 대한 대답은 다음 있도록했다 : 불완전 방화벽 (UFW)를 도커를 사용할 때 아무것도 차단하지에 링크 된이, 코멘트

나는 일반적으로 iptables 규칙 / nat / 라우팅에 대한 이해가 매우 낮기 때문에 왜 비합리적인 일을했을 수 있습니다.

내가 잘못 구성하고 컨테이너 내부의 DNS 확인을 죽인 것으로 밝혀졌습니다. 대화 형 컨테이너 터미널을 실행할 때 :docker run -i -t ubuntu:14.04 /bin/bash

나는 다음과 같은 결과를 얻었다.

root@6b0d832700db:/# ping google.com
ping: unknown host google.com

root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms

모든 ufw 구성 (before.rules)을 되돌리고 ufw를 비활성화하고 / etc / default / docker에서 iptables = false를 제거하면 컨테이너의 DNS 확인 기능이 복원되었습니다.

대신 이 지침 에 따라 ufw 기능을 다시 활성화 할 수 있기를 기대합니다 .


3

동일한 문제가 있으며 언급 된 단계를 시도했지만 네트워크 설정을 새로 고칠 때까지 작동하지 않는 것 같습니다.

단계들:

  1. 언급 한 바와 같이, 추가 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"/etc/default/docker.
  2. 를 사용하여 PREROUTING 테이블 내용을 수동으로 플러시합니다 iptables -t nat -F POSTROUTING. 이것을 실행 한 후 docker를 다시 시작하면 새 IP 범위로 nat 테이블이 초기화됩니다.

3

나에게 같은 문제 (Ubuntu Xenial에서).

  • docker run --dns ... 컨테이너가 작동했습니다.
  • docker build(docker-compose 등)에 대한 도커 데몬 옵션 업데이트 가 작동하지 않았습니다.

도커 로그 ( journalctl -u docker.service)를 분석 한 후 잘못된 resolvconf에 대한 경고가 적용된 경우.

그 후 회사 이름 서버가 네트워크 인터페이스에 추가되었지만 resolvconf에는 추가되지 않았습니다.

이 솔루션 적용 인터페이스에서 정적 DNS를 어떻게 구성합니까? (askubuntu) , 즉 네임 서버 추가/etc/resolvconf/resolv.conf.d/tail

resolvconf를 업데이트 한 후 (또는 재부팅).

bash docker run --rm busybox nslookup google.com

즉시 일했습니다.

내 모든 docker-compose 빌드가 이제 작동합니다.


2

오늘도 같은 문제가 발생했습니다. / etc / default / docker에 아래 줄을 추가했습니다.

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

그런 다음 랩톱을 다시 시작했습니다.

제 경우에는 도커 데몬을 다시 시작하는 것으로 충분하지 않습니다. 랩톱을 다시 시작해야 작동합니다.


2

다른 솔루션에 너무 많은 시간을 소비하기 전에 Docker를 다시 시작 하고 다시 시도하십시오.

Windows 10에서 Windows 용 Docker Desktop을 사용하여 문제를 해결했습니다.


관리자 권한으로 다시 시작하면 제 경우 문제가 해결되었습니다.
정맥

1

나는 이것으로 얼마 동안 어려움을 겪었지만 여기에서 나를 위해 그것을 해결했습니다 Ubuntu 16.04 x64. 누군가의 시간도 절약되기를 바랍니다.

  1. In /etc/NetworkManager/NetworkManager.conf: 주석 처리 #dns=dnsmasq

  2. 생성 (또는 수정) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. 다음을 사용하여 Docker를 다시 시작하십시오. sudo service docker restart


사실 아닙니다. NetworkManager.conf의 수정은 제 경우에 차이를 만들었습니다.
palamunder

dnsmasq 시스템 전체를 비활성화하는 것이 Docker를위한 최상의 솔루션이라고 매우 의심합니다
OneCricketeer

나는이 문제로 이틀간 싸운 후 나에게 효과가 있었던 것을 공유하고있다.
palamunder

이것은 나를 위해 작동하지 않았습니다
desmond13

0

내 시스템 ( macOS High Sierra 10.13.6와 함께 Docker 2.1.0.1)에서 이것은 회사 프록시 때문이었습니다.

나는 이것을 두 단계로 해결했다.

  1. 수동으로 프록시 설정 구성 Preferences>Proxies
  2. 다음 ~/.docker/config.json과 같이 config.json에 동일한 설정을 추가하십시오 .

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.