docker.io DNS가 작동하지 않습니다. 8.8.8.8을 사용하려고합니다.


33

새로운 Ubuntu 14.04 설치가 있으며 Docker를 사용하여 12.04가 필요한 이전 항목을 실행하려고합니다. Docker 내부의 DNS가 작동하지 않습니다.

내 노트북의 resolv.conf는 다음과 같습니다.

nameserver 127.0.0.1

Docker에서 작동하지 않는 것 같습니다. 따라서 네임 서버를 8.8.8.8 및 8.8.4.4로 설정하려고 시도합니다. 내가 할 때

$ sudo docker run -i -t ubuntu /bin/bash

그것은 말한다 :

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

Docker 인스턴스 내에서 resolv.conf는 다음과 같이 보입니다.

nameserver 8.8.8.8
nameserver 8.8.4.4

Docker 인스턴스 내에서 두 가지 모두 성공적으로 핑할 수 있습니다. 그러나 DNS가 없습니다 (예 : ping google.com실패).

Docker 내부의 ifconfig 출력 :

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.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:1500  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)

이제 뭐?

답변:


23

Ubuntu Docker 패키지가 systemd 사용으로 업데이트되면 /etc/default/docker구성 파일에 대한 지원이 중단 되어 rocketman10404에서 제안한 초기 솔루션 이 더 이상 작동하지 않습니다 (비활성화 dnsmasq는 여전히 작동하지만 Ubuntu가 자동으로 DNS 서버를 업데이트하지 못하게하는 단점이 있음) .

daemon.json구성 파일 에서 수정

네트워크의 DNS 서버를 찾으십시오.

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

존재하지 않는 경우 열거 나 작성 /etc/docker/daemon.json하고 DNS 설정을 ExecStart라인에 추가하십시오 .

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

docker 데몬을 다시 시작하십시오.

$ sudo service docker restart

자세한 블로그 게시물을 작성 하고 자세한 내용을 원하면이 문제에 대한 버그신고했습니다 .

(원래 나는 /lib/systemd/system/docker.service열고 ExecStart 라인에 DNS 설정을 추가 하여 문제를 해결 했지만 시스템 파일을 직접 편집해서는 안됩니다 .)


귀하의 솔루션에 감사드립니다. 내 솔루션으로가는 길에 도움이되었습니다. 내 상황과 Docker를 Ubuntu (또는 NetworkManager + dnsmasq를 사용하는 다른 데스크톱 배포판)에서 실행하는 특성과 약간 더 우아하다고 생각합니다.
Adrian

16

나는 도커를 직접 사용하지 않으므로 일반적으로 도커 질문에 대해서는 언급하지 않았지만 방금 그것에 대해 읽었고이 정확한 문제해결 하는 것으로 보이는 도커 문서를 우연히 발견했습니다 . 요약하면 ...

이 문서는 몇 가지 해결 방법을 제안합니다. 첫 번째는 다음 줄을 컨테이너에 추가하여 컨테이너에 대한 docker 데몬에서 사용할 DNS 서버를 지정하는 것입니다 /etc/default/docker.

docker_OPTS="--dns 8.8.8.8"

제공된 DNS는 192.168.1.1 (게이트웨이)과 같은 로컬 DNS 서버 일 수 있습니다. 그런 다음

sudo restart docker

다른 해결책은 /etc/NetworkManager/NetworkManager.conf다음과 같이 구성을 주석 처리하여 NetworkManager에서 dnsmasq를 비활성화하는 것입니다 .

#dns=dnsmasq

그런 다음 두 가지를 모두 다시 시작하십시오.

sudo restart network-manager
sudo restart docker

3
dnsmasq를 비활성화하면 나를 위해 일했습니다.
bennyl

2
후자의 접근 방식은 네트워크 관리자가 dnsmasq를 제어 할 수 없음을 의미합니다. 예를 들어 VPN으로의 전환을 포함하여 네트워크를 변경할 때 DNS 서버를 변경할 수 없습니다. 전자의 접근 방식은 나에게 더 좋아 보이지만 dnsmasq가 docker IP (172.17.0.1)에서 수신 대기하도록하여 도커 호스트를 가리킬 수 있기를 바랍니다.
mc0e

1
Ubuntu가 sytemd로 Docker를 설정하도록 전환했기 때문에 /etc/default/docker더 이상 영향을 미치지 않습니다. post-init.d / upstart 세계 에서이 문제를 해결하는 방법에 대한 내 솔루션 을 참조하십시오 .
Robin Winslow

/etc/NetworkManager/NetworkManager.confUbuntu 18.04 LTS에는 존재하지 않습니다. : /
XtraSimplicity

일부 Ubuntu 18.04 설정 (예 : Amazon의 최소 이미지) systemd-resolved은 기본적으로 캐싱 DNS 서버 역할을하며 WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.문제 를 유발합니다 (Ubuntu 16.04 설정은 기본적으로 활성화하지 않는 것으로 나타남). 해결 방법은 기본 답변에서 언급 한대로 컨테이너를 시작할 때 옵션을 비활성화 systemd-resolved하거나 사용하는 --dns것입니다.
Anon

9

나는 내 상황에서 이것을 구체적으로 보았습니다.

  • 로컬 개발 시스템에서 Docker 컨테이너 실행
  • 어느 VPN에 연결되어
  • 일부 컨테이너 빌드 스크립트는 컨테이너 내부의 VPNnpm install 의 사용자 정의 저장소 에서 실행 하는 것과 같은 작업 을 수행합니다 .
    • 이는 npm성공적인 DNS 조회를 수행 할 수 없기 때문에 개발자 파이프 라인이 아닌 CI 파이프 라인에서 작동합니다.
    • 외부 REST API를 호출하기 위해 조회해야하는 컨테이너에 문제가있었습니다.

기본적으로 Ubuntu는 dnsmasqNetworkManager에 의해 시작되어 DNS 요청을 캐시 /etc/resolv.conf하고이 인스턴스를 가리 키도록 구성 합니다.127.0.1.1

  • 우리가 사용하는 VPN 클라이언트는 NetworkManager와 호환되지 않으며 /etc/resolv.confNetworkManager 구성을 덮어 쓰는 자체 클라이언트를 강제합니다.
  • VPN 용 DNS 서버를 구성합니다.
  • Docker /etc/resolv.conf는 기본적으로 컨테이너에 그림자를 만듭니다.
    • 일반적으로 우분투에서는 dnsmasq상황 에 대해 알고 있기 때문에 Google DNS 서버를 컨테이너로 전달합니다 .
    • 그러나 VPN DNS 서버 구성을 컨테이너에 전달하는 것이 행복합니다.
    • docker0네트워크 브리지 의 컨테이너에서 VPN tap0어댑터를 통한 DNS 서버로의 경로는 없습니다 .
  • Ergo, 컨테이너의 모든 DNS 조회는 제공되는 유일한 DNS 서버에 도달 할 수 없으므로 실패합니다
  • 또한 일부 네트워크는 모든 DNS 조회를 스누핑하려는 경우 Google DNS 서버에 대한 요청을 차단합니다.

해결책 :

NetworkManager를 사용하는 것이 더 우아해 보 dnsmasq였으며 디자인 된 방식으로 조임 인스턴스입니다.

  1. Docker에게 dnsmasqDNS에 인스턴스 를 사용하도록 지시

    • /etc/docker/daemon.jsonDocker에게 docker0DNS 용 브리지 어댑터 를 사용하도록 파일 추가 또는 편집

      {
        "dns": ["172.17.0.1"]
      }
      
  2. dnsmasqDocker 브리지를 수신하도록 NM 인스턴스도 구성하십시오. 기본적으로 127.0.1.1 만 수신하므로 파일 작성/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. 해당 VPN 클라이언트의 무례한 행동이 마음에 들지 않으며 VPN 조회를 위해 VPN 끝에서 DNS 만 사용하고 싶습니다 (NetworkManager를 올바르게 구성한 정중 한 VPN 클라이언트가있는 경우에는이 작업을 수행 할 필요가 없습니다) )

    • VPN 클라이언트에서 DNS 기능 끄기 ( resolv.conf연결시 덮어 쓰기가 중지 되고 모든 DNS가 dnsmasq다시 통과 됨 )
    • dnsmasq도메인에 대한 DNS 요청을 적절하게 지시 하도록 설정 파일 추가-`/etc/NetworkManager/dnsmasq.d/vpn-dns.conf 파일 추가

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • 선택적으로 짧은 이름을 사용할 수 있도록 도메인의 검색 도메인을 추가하십시오.

      • 기본 네트워크 연결에서 로컬 도메인을 검색 목록에 추가했습니다.
  4. NetworkManager 및 Docker를 다시 시작하십시오.

    sudo service network-manager restart
    sudo service docker restart
    

이 시점 nslookup에서 VPN 내부 및 외부의 도메인에 대해 VPN을 사용할 때 Docker 컨테이너가 문제없이 수행 될 수 있어야합니다 .


1
docker0 bridge IP를 하드 코딩하지 않는 간단한 조정은 listen-address 지시문 대신 interface를 사용하는 것입니다. interface = docker0
siwyd

멋진 설명과 지시. +1 가치가 있습니다.
ereOn

건배 @simonwydooghe-당신의 제안을 통합했습니다-당신은 또한 그 필드에 와일드 카드를 사용할 수 있습니다.
Adrian

1
daemon.json의 dns 값이 배열이어야하는 것 같습니다. 그렇지 않으면 cannot unmarshal string into Go value of type []string도커 서비스를 다시 시작할 때 오류가 발생 합니다.
Slaven Rezic

Bionic에 대한 업데이트 : 18.04는 더 이상 DNS 용 NetworkManager로 관리되는 dnsmasq의 캡 티브 인스턴스를 사용하지 않고 대신 systemd-resolved를 사용합니다. docker0 브리지를 수신하도록 구성 할 수 없기 때문에 자체 문제가 발생합니다. 나는 그것을 비활성화하고 NetworkManager dnsmasq를 다시 설치하고 올바르게 구성하는 것에 의지했습니다.
Adrian

2

헤드리스를 실행하는 Ubuntu 14.04 서버에서 도커를 설정하는 방법은 다음과 같습니다.

다음 도커 버전이 설치된 Ubuntu 서버 14.04를 실행 중입니다.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

/etc/init/docker.io.conf 파일과 스크립트에는 다음 줄이 포함되어 있습니다.

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

위의 답변은 위의 파일을 찾는 데 도움이되었습니다.

/etc/default/docker.io에서 다음을 주석 해제하고 로컬 DNS 서버를 추가했습니다.

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

다음을 사용하여 서비스를 다시 시작했습니다.

sudo service docker.io restart

docker run <image> /bin/bash

컨테이너를 시작할 때 dns 메시지가 없습니다.

dnsutils가 설치된 새 컨테이너를 시작했습니다.

Ran dig 및 서버 메시지가 올바른 로컬 DNS 서버입니다.


0

비슷한 문제가 발생 하여 StackOverflow 에보 고했습니다 . 8.8.8.8Docker의 기본 Ubuntu 설치에 지정된 네임 서버를 쿼리 할 수없는 것으로 보입니다 . 그러나 나는 그것을 핑할 수 있었다. 이 경우 실제로 쿼리 할 수있는 DNS 서버를 사용하십시오. 로 테스트

nslookup - dns.server.name

통해 컨테이너를 시작

docker run --dns=ip.addr.of.dns

https://askubuntu.com/q/607172/30266 에서 자동 솔루션을 도출하는 방법을 아직 찾지 못했습니다 .


내 대답은 당신을 위해 충분히 자동적 인 것일 수 있습니다 ...
Adrian

0

dnsmasqDocker 컨테이너가 사용자 정의 네트워크 에있는 경우 호스트의 로컬 DNS 확인자 (예 :)를 사용할 수 있습니다 . 이 경우 컨테이너 /etc/resolv.conf에는 네임 서버 127.0.0.11(일명 Docker의 내장 DNS 서버 )가있어 DNS 요청을 호스트의 루프백 주소로 올바르게 전달할 수 있습니다.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

를 사용하면 docker-compose컨테이너에 대한 사용자 지정 네트워크가 자동으로 설정됩니다 (파일 형식 v2 + ). 그러나 docker-compose사용자 정의 네트워크에서 컨테이너 를 실행 하는 동안 여전히 기본 네트워크 에서 컨테이너를 빌드합니다 . 빌드에 사용자 정의 네트워크를 사용하려면 빌드 구성network 에서 매개 변수를 지정할 수 있습니다 (파일 형식 v3.4 + 필요 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.