Docker 컨테이너는 Ubuntu 14.04 Desktop Host에서 DNS를 확인할 수 없습니다.


48

Ubuntu 14.04 LTS의 Docker 컨테이너에 문제가 있습니다. Docker는 이틀 동안 잘 작동했으며 갑자기 컨테이너 내부의 모든 네트워크 연결이 끊어졌습니다. 아래의 오류 출력은 처음에 apt-get이 IPv6을 통해 DNS를 해결하려고 시도했기 때문이라고 생각합니다.

호스트 컴퓨터에서 IPv6을 비활성화했지만 여전히 모든 이미지를 제거하고 기본 우분투를 가져 와서 여전히 문제가 발생했습니다.

/etc/resolve.conf 네임 서버를 로컬 DNS 서버에서 Google의 퍼블릭 DNS 서버 (8.8.8.8 및 8.8.4.4)로 변경했지만 여전히 운이 없습니다. 또한 / etc / default / docker의 DOCKER_OPTS에서 DNS를 Google로 설정하고 도커를 다시 시작했습니다.

나는 또한 coreos를 당기려고했지만 yum은 DNS를 해결할 수 없었습니다.

DNS가 작동하지 않는 동안 apt-get이 해결할 수없는 동일한 업데이트 서버를 핑할 때 여전히 응답을 받기 때문에 이상합니다.

나는 프록시 뒤에 있지 않고 매우 표준 로컬 네트워크에 있으며이 버전의 Ubuntu는 최신 상태입니다 (이틀 전에 도커에 더 가깝게 설치되었습니다).

나는 stackoverflow 및 github 문제에 대한 다른 게시물을 통해이를 철저히 조사했지만 해결책을 찾지 못했습니다. 이 문제를 해결하는 방법에 대한 아이디어가 없습니다. 아무도 도울 수 있습니까?

에러 메시지

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

컨테이너 IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# 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=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

또한 IPv4를 강제 실행하면 apt-get 업데이트가 실패합니다.

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

나를 위해, 그것은 다시 시작한 후에 일했습니다.
ssi-anik

답변:


63

우, 내 문제를 해결하는 github에 대한 게시물을 찾았습니다.

Steve K.가 실제로 DNS 문제가 아니며 연결 문제라고 지적한 후 github 에서이 문제를 해결하는 방법을 설명하는 게시물 을 찾을 수있었습니다 .

분명히 docker0 네트워크 브리지가 끊어졌습니다. bridge-utils를 설치하고 다음을 실행하면 Docker가 정상적으로 작동합니다.

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

1
이미지를 다시 칠할 필요가 없습니다. resolv.conf는 새 컨테이너를 실행할 때마다 생성됩니다. 따라서 오래된 컨테이너를 제거하고 다른 컨테이너를 시작해야합니다. 나는 어제이 문제에 매료되었다. 또한 회사 인트라넷에있는 경우 --dns --dns 플래그 근처의 DOCKER_OPTS env 변수에있는 / etc / default / docker의 도커 데몬에 --dns-search = your.company.domain을 전달할 수 있습니다.
Alexander.Iljushkin

이로 인해 도커 문제가 해결되었습니다.
BobMcGee

3
아치 리눅스에 나는 필요로 ip link set down docker0대신 ifconfig docker0 down하고 systemctl restart docker대신 service docker start. 모든 이미지를 삭제하려면 다음과 같이하십시오.docker rmi $(docker images -q)
meshy

그것은 처음으로 효과가있었습니다. 그런 다음 재부팅하고 문제가 다시 나타납니다. 해당 단계를 재현해도 문제가 다시 해결되지 않았습니다. 나는 이것이 무엇인지 전혀 모른다.
user626921

1
그냥 내 docker0 인터페이스가 다운 된 것을보고 내가 실행 /etc/init.d/docker restart과 비즈니스에 돌아왔다
lolesque

14

DNS 확인자 문제인 경우 해결책은 다음과 같습니다.

먼저 확인해야 할 것은 docker 컨테이너cat /etc/resolv.conf 에서 실행 됩니다 . 와 같은 잘못된 DNS 서버가있는 경우 컨테이너는 도메인 이름을 ip 주소로 확인할 수 없으므로 실패합니다.nameserver 127.0.x.xping google.com

두 번째로 확인해야 할 것은 호스트 시스템cat /etc/resolv.conf 에서 실행 됩니다 . Docker는 기본적으로 컨테이너가 시작될 때마다 호스트 를 컨테이너에 복사합니다 . 따라서 호스트 가 잘못되면 도커 컨테이너도 마찬가지입니다./etc/resolv.conf/etc/resolv.conf

호스트 /etc/resolv.conf가 틀렸다는 것을 발견하면 다음 두 가지 옵션이 있습니다.

  1. daemon.json에서 DNS 서버를 하드 코드하십시오. 이것은 쉽지만 DNS 서버가 변경 될 것으로 예상되는 경우에는 이상적이지 않습니다.

  2. 호스트를 수정하십시오 /etc/resolv.conf. 이것은 조금 까다 롭지 만 동적으로 생성되며 DNS 서버를 하드 코딩하지 않습니다.


1. docker daemon.json의 DNS 서버 하드 코드

  • 편집하다 /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • 변경 사항을 적용하려면 docker 데몬을 다시 시작하십시오.
    sudo systemctl restart docker

  • 이제 컨테이너를 실행 / 시작하면 docker가의 /etc/resolv.conf값으로 채워집니다 daemon.json.


2. 호스트 수정 /etc/resolv.conf

A. 우분투 16.04 및 이전

  • Ubuntu 16.04 이하의 경우 /etc/resolv.confNetworkManager에 의해 동적으로 생성되었습니다.

  • 라인 주석 dns=dnsmasq의 (a와 #)의를 /etc/NetworkManager/NetworkManager.conf

  • NetworkManager를 다시 시작하여 다음을 재생성하십시오 /etc/resolv.conf.
    sudo systemctl restart network-manager

  • 호스트에서 확인하십시오. cat /etc/resolv.conf

B. 우분투 18.04 이상

  • Ubuntu 18.04는를 systemd-resolved생성하는/etc/resolv.conf 데 사용 하도록 변경되었습니다 . 이제 기본적으로 로컬 DNS 캐시 127.0.0.53을 사용합니다. 컨테이너 내부에서는 작동하지 않으므로 Docker는 기본적으로 Google의 8.8.8.8 DNS 서버로 설정되어 방화벽 뒤에있는 사람들에게는 손상 될 수 있습니다.

  • /etc/resolv.conf실제로 Ubuntu 18.04에서 기본적 ls -l /etc/resolv.conf으로 /run/systemd/resolve/stub-resolv.conf(127.0.0.53) 을 가리키는 심볼릭 링크 ( )입니다 .

  • /run/systemd/resolve/resolv.conf실제 DNS 서버를 나열 하도록 심볼릭 링크를 변경하십시오 .
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • 호스트에서 확인하십시오. cat /etc/resolv.conf

이제 /etc/resolv.confdocker가 컨테이너에 복사 할 수있는 유효한 호스트 가 있어야합니다 .


이것에 감사드립니다. 실제로 Docker 컨테이너와 18.04의 VPN에서 IP를 확인하는 과정을 이해하려고 노력하고 있습니다. 18.04에 대한 /etc/resolv.conf 수정이 저에게 효과적이었습니다!
조지 파파스

옵션 B는 나를 위해 일했다 ..
codeSetter

확실히 2B는 systemd패키지 의 업데이트에서 살아남을 수 없습니다 ...
Auspex

13

내가 경험 한 문제에 부가 가치를 추가하려는 시도에서; 다른 대답으로 :

내 네트워크는 사무실과 관련이 있었고 컨테이너는 IP 주소는 핑할 수 있지만 도메인 이름은 핑할 수 없도록 Google DNS 설정이 차단되었습니다.

내 호스트의 /etc/resolv.conf원래 모습은 다음과 같습니다.

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

이는 Network Manager가 DNS 서버 세부 사항에 대해 일종의 마스킹을 수행하기 때문입니다.

불행히도 docker manuals 에 따르면 docker는 컨테이너의 resolv.conf를 빌드 할 때 로컬 호스트 IP 주소를 필터링하여 Google의 DNS IP로 대체합니다. 필자의 경우 도메인 이름이 제한을 벗어났습니다.

나는해야했다 :

  • /etc/default/docker컨테이너가 호스트의 resolv.conf 컨텐츠를 대신 사용하도록 my 를 기본값으로 재설정하십시오 .
  • 행을 편집 /etc/NetworkManager/NetworManager.conf하고 주석 처리하십시오 dns=dnsmasq. 따라서 NM은 127.0.0.1 대신 실제 DNS IP 주소를 지정할 수 있습니다.
  • 로 NM을 다시 시작하십시오 sudo service network-manager restart.
  • 로 도커 서비스를 다시 시작하십시오 sudo service docker restart.

컨테이너를 실행하면 apt-get update/upgrade예를 들어 컨테이너를 수행 할 수 있습니다 .


3
이것은 실제로 나를 위해 일했습니다. 그리고 회사 인트라넷 뒤에있었습니다
Daniel Andrei Mincă

1
이 솔루션은 Ubuntu 16.04 및 이전 버전에 적합합니다. Ubuntu 18.04 이상에 대해서는 serverfault.com/a/918568
wisbucky를

감사! 이것은 받아 들여진 대답은 효과가 없었지만 효과가있었습니다. :)
Devolus

8

귀하의 오류는 여기에 있습니다 :

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

이것은 DNS의 오류가 아니라 시스템이 IPv6 호스트에 연결하려고 시도하고 실패하는 것입니다. 호스트에 IPv6 액세스 권한이 없기 때문일 수 있습니다. IPv6 주소의 실제 조회가 성공합니다. (우분투 미러 / 아카이브는 IPv6와 IPv4 모두에서 사용할 수 있습니다. 시스템이 제대로 작동한다고 생각하기 때문에 IPv6에 도달 할만큼 운이 없었습니다.)

miredo설치 하여 수정 하거나 IPv4 미러에 도달 할 때까지 다시 시도해야합니다.

여기서 다시 한 번 알아야 할 것은 자신의 핑 테스트에서 볼 수 있듯이 DNS가 책임을지지 않는다는 것입니다.


1
빠른 답변과 실제로 DNS 문제가 아님을 분명히 해 주셔서 감사합니다. 나는 miredo를 설치했다. apt-get update -o Acquire :: ForceIPv4 = true apt-get 업데이트가 여전히 실패하면 해당 게시물로 원래 게시물을 업데이트했음을 주목할 가치가 있습니다. 나는 아마도 UFW 사고를 비활성화하려고 시도했지만 여전히 운이 없었습니다.
Thomas V.

이상한-핑이 성공했기 때문에 IPv4 연결이 가능하다는 것을 알 수 있습니다. 하지만 당신은 거울에 관계없이 당신은 몇 가지 이상한 라우팅 / 네트워킹 문제가 제시에 연결할 수 없습니다 (난 당신이 여기에 게시하는 이유를 추측하는!)

8

Docker 공식 문서 는 Docker에서 사용할 DNS 서버를 구성하는 도구를 제공합니다.

  1. /etc/default/docker편집 할 파일을여십시오.

    sudo nano /etc/default/docker
    
  2. Docker에 대한 설정을 추가하십시오.

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. 8.8.8.8와 같은 로컬 DNS 서버로 교체하십시오 192.168.1.1. 여러 DNS 서버를 지정할 수도 있습니다. 예를 들어 공백으로 구분하십시오.

    --dns 8.8.8.8 --dns 192.168.1.1
    

    경고 : 다양한 네트워크에 연결된 랩톱에서이 작업을 수행하는 경우 공용 DNS 서버를 선택하십시오.

    추신 : nm-tool로컬 호스트 DNS 서버를 확인하는 데 사용할 수 있습니다

  4. 파일을 저장하고 닫습니다.

  5. Docker 데몬을 다시 시작하십시오.

    sudo service docker restart
    

Docker Upstart 및 SysVinit의 이전 구성 파일입니다. systemd의 현재 방법 (Ubuntu 16.04부터)은 dns와 같은 /etc/docker/daemon.jsondocker 데몬 설정 에 사용하는 것 입니다 .
wisbucky 2016 년

0

boot2docker를 사용하는 동안 여기에 오는 다른 독자들을 위해 여기에 내가 고쳐진 방법이 있습니다. 사실, 위의 대답은 올바른 방향을 가리 켰습니다.

기본적으로 어떤 이유로 boot2docker 내의 컨테이너가 호스트 이름을 확인할 수 없습니다.

방금 boot2docker를 다시 시작하고 컨테이너를 시작했습니다. 이제 호스트 이름을 다시 올바르게 확인할 수 있습니다.

호스트의 네트워크가 연결되어있는 동안 boot2docker를 시작하면 문제가 발생하여 boot2docker가 시작되어 작동하지 않는 상태가되었습니다.


0

Windows에서 동일한 문제가 발생했습니다. 이 명령은 나를 위해 일했습니다 :docker-machine restart


0

Debian9에서 Docker 데몬을 다시 시작하십시오.

service docker restart

연결과 네트워크가 제대로 작동합니다


-1

비슷한 문제가 있었지만 사용자 정의 네트워크 내부의 컨테이너간에 이름을 확인하는 것이 약간 색다른 것처럼 보였습니다. 일부는 당신 같은 것을 해결할 수 없습니다.

이 문제는 / var / lib / docker로 옮겨졌습니다. 공간상의 이유로 nfs를 통해 마운트되었습니다. 로컬 파일 시스템을 추가하고 파일을 이동하면 문제가 해결됩니다.


비슷한 질문에 대한 답변으로 질문에 대답 할 수 있다고 생각되면 해당 질문의 복제본으로 표시하십시오. 그렇게 할 수 없다면 별도의 답변을 남기지 말고 의견을 남겨야합니다.
Jenny D는 Monica Reinstate Monica가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.