docker.io DNS가 작동하지 않습니다. 8.8.8.8을 사용하려고합니다. 할 때 $ sudo docker run -i

새로운 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)

이제 뭐?



답변

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 데몬에서 사용할 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

답변

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

  • 로컬 개발 시스템에서 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 컨테이너가 문제없이 수행 될 수 있어야합니다 .


답변

헤드리스를 실행하는 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 서버입니다.


답변

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

nslookup - dns.server.name

통해 컨테이너를 시작

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

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


답변

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 + 필요 ).