새로운 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에 연결되어
- 일부 컨테이너 빌드 스크립트는 컨테이너 내부의 VPN
npm install
의 사용자 정의 저장소 에서 실행 하는 것과 같은 작업 을 수행합니다 .- 이는
npm
성공적인 DNS 조회를 수행 할 수 없기 때문에 개발자 파이프 라인이 아닌 CI 파이프 라인에서 작동합니다. - 외부 REST API를 호출하기 위해 조회해야하는 컨테이너에 문제가있었습니다.
- 이는
기본적으로 Ubuntu는 dnsmasq
NetworkManager에 의해 시작되어 DNS 요청을 캐시 /etc/resolv.conf
하고이 인스턴스를 가리 키도록 구성 합니다.127.0.1.1
- 우리가 사용하는 VPN 클라이언트는 NetworkManager와 호환되지 않으며
/etc/resolv.conf
NetworkManager 구성을 덮어 쓰는 자체 클라이언트를 강제합니다. - VPN 용 DNS 서버를 구성합니다.
- Docker
/etc/resolv.conf
는 기본적으로 컨테이너에그림자를 만듭니다.
- 일반적으로 우분투에서는
dnsmasq
상황 에 대해 알고 있기 때문에 Google DNS 서버를 컨테이너로 전달합니다 . - 그러나 VPN DNS 서버 구성을 컨테이너에 전달하는 것이 행복합니다.
docker0
네트워크 브리지 의 컨테이너에서 VPNtap0
어댑터를 통한 DNS 서버로의 경로는 없습니다 .
- 일반적으로 우분투에서는
- Ergo, 컨테이너의 모든 DNS 조회는 제공되는 유일한 DNS 서버에 도달 할 수 없으므로 실패합니다
- 또한 일부 네트워크는 모든 DNS 조회를 스누핑하려는 경우 Google DNS 서버에 대한 요청을 차단합니다.
해결책 :
NetworkManager를 사용하는 것이 더 우아해 보 dnsmasq
였으며 디자인 된 방식으로 조임 인스턴스입니다.
-
Docker에게
dnsmasq
DNS에 인스턴스 를 사용하도록 지시-
/etc/docker/daemon.json
Docker에게docker0
DNS 용 브리지 어댑터 를 사용하도록 파일 추가 또는 편집{ "dns": ["172.17.0.1"] }
-
-
dnsmasq
Docker 브리지를 수신하도록 NM 인스턴스도 구성하십시오. 기본적으로 127.0.1.1 만 수신하므로 파일 작성/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
# Default Docker bridge interface=docker0 # Other Docker bridges interface=br-*
-
해당 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
-
선택적으로 짧은 이름을 사용할 수 있도록 도메인의 검색 도메인을 추가하십시오.
- 기본 네트워크 연결에서 로컬 도메인을 검색 목록에 추가했습니다.
- VPN 클라이언트에서 DNS 기능 끄기 (
-
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.8
Docker의 기본 Ubuntu 설치에 지정된 네임 서버를 쿼리 할 수없는 것으로 보입니다 . 그러나 나는 그것을 핑할 수 있었다. 이 경우 실제로 쿼리 할 수있는 DNS 서버를 사용하십시오. 로 테스트
nslookup - dns.server.name
통해 컨테이너를 시작
docker run --dns=ip.addr.of.dns
https://askubuntu.com/q/607172/30266 에서 자동 솔루션을 도출하는 방법을 아직 찾지 못했습니다 .
답변
dnsmasq
Docker 컨테이너가 사용자 정의 네트워크 에있는 경우 호스트의 로컬 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 + 필요 ).