it-swarm-ko.com

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

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
[email protected]:/# 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)

[email protected]:/# 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
[email protected]:/# 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 업데이트가 실패합니다.

[email protected]:/# 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  
51
Thomas V.

우, 내 문제를 해결하는 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
66
Thomas V.

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

우선 확인해야 할 것은 docker 컨테이너 에서 cat /etc/resolv.conf입니다. nameserver 127.0.x.x와 같은 잘못된 DNS 서버가있는 경우 컨테이너는 도메인 이름을 ip 주소로 확인할 수 없으므로 ping 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를 수정하십시오

우분투 16.04 및 이전 버전

  • Ubuntu 16.04 이하의 경우 NetworkManager에서 /etc/resolv.conf를 동적으로 생성했습니다.

  • dns=dnsmasq에서 # (/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는 실제로 우분투 18.04에서 기본적으로 ls -l /etc/resolv.conf (127.0.0.53)를 가리키는 심볼릭 링크 (/run/systemd/resolve/stub-resolv.conf)입니다.

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

  • 호스트에서 확인 : cat /etc/resolv.conf

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

16
wisbucky

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

내 네트워크는 사무실과 관련이 있었고 컨테이너는 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 도커는 컨테이너의 resolv.conf를 만들 때 로컬 호스트 IP 주소를 필터링하여 Google의 DNS IP로 대체합니다. 필자의 경우 도메인 이름이 제한을 벗어났습니다.

나는해야했다 :

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

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

13

Docker official doc Docker에서 사용할 DNS 서버를 구성하는 도구를 제공합니다

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

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

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

    --dns 8.8.8.8 --dns 192.168.1.1
    

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

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

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

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

    Sudo service docker restart
    
8
tryer3000

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

 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가 책임을지지 않는다는 것입니다.

8
user9565

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

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

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

호스트의 네트워크가 연결되어있는 동안 boot2docker가 시작되어 boot2docker가 시작되어 작동하지 않는 상태가되었다고 가정합니다.

0
Eye

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

service docker restart

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

0
Nolwennig

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

0
speedplane