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.