2015-10-20 20 views
6

Tôi đang chạy docker-compose với node:4.2.1-wheezydnsdock vùng chứa.Docker DNS getaddrinfo ENOTFOUND

Tôi có DOCKER_OPTS="--dns 172.17.42.1" bên trong/etc/default/docker.

Khi tôi chạy node -e "require('dns').resolve('host_name_here')" bên trong vùng chứa node.js của mình, máy chủ được giải quyết chính xác thông qua máy chủ dns 172.17.42.1.

Nhưng khi tôi chạy node -e "require('dns').lookup('host_name_here')" không thành công với lỗi ENOTFOUND.

Và vấn đề là http.request sử dụng dns.lookup thay vì dns.resolve.

The docs say rằng dns.lookup gọi getaddrinfo. Và theo tôi hiểu được getaddrinfo cache /etc/resolv.conf và có thể nó lưu trữ rỗng /etc/resolv.conf (nhưng cat /etc/resolv.conf in nameserver 172.17.42.1).

Tôi thực sự không biết cách giải quyết vấn đề này. Điều gì có thể gây ra hành vi như vậy?

Update 1.

docker -v 
Docker version 1.7.1, build 786b29d 

docker-compose -v 
docker-compose version: 1.4.2 

Cập nhật 2.

tôi cập nhật tất cả mọi thứ lên phiên bản mới nhất (1.9.0 Docker, Docker-soạn 1.5.0 và nút lên đến 5,0 .0) nhưng vấn đề vẫn tồn tại.

Vì vậy, đây là Docker-compose.yml rằng tái tạo vấn đề:

dnsdock: 
    image: tonistiigi/dnsdock 
    volumes: 
    - /var/run/docker.sock:/run/docker.sock 
    ports: 
    - "172.17.42.1:53:53/udp" 
    environment: 
    - DNSDOCK_ALIAS=dns.org 
node: 
    image: node:5.0.0-wheezy 
    command: node -e "setTimeout(function() { var dns = require('dns'); dns.resolve('dns.org', console.log.bind(console, 'resolve')); dns.lookup('dns.org', console.log.bind(console, 'lookup')); }, 5000)" 
    dns: 172.17.42.1 

Bạn nên thay thế 172.17.42.1 với IP của giao diện docker0 của bạn. Cần setTimeout(..., 5000) vì vùng chứa node có thể bắt đầu trước dnsdock.

Đây là docker-compose up đầu ra của tôi:

Creating test_node_1 
Creating test_dnsdock_1 
Attaching to test_node_1, test_dnsdock_1 
dnsdock_1 | 2015/11/07 09:29:44 Added service: 3653951cff40c06c04b9ab3f5d2fc94ccc19305eaac7ba1a545ce1dbab3e3e17 {test_dnsdock_1 dnsdock 172.17.42.3 -1 [dns.org]} 
dnsdock_1 | 2015/11/07 09:29:44 Added service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140 {test_node_1 node 172.17.42.2 -1 []} 
node_1 | resolve null [ '172.17.42.3' ] 
node_1 | lookup { [Error: getaddrinfo ENOTFOUND dns.org] 
node_1 | code: 'ENOTFOUND', 
node_1 | errno: 'ENOTFOUND', 
node_1 | syscall: 'getaddrinfo', 
node_1 | hostname: 'dns.org' } 
dnsdock_1 | 2015/11/07 09:29:49 Stopped service: 36577feea136bc713f77b64b2a6a9712cd509c47ca55427f6749308cc5a4b140 
test_node_1 exited with code 0 
+0

Bạn có thể chia sẻ trình tạo docker hay không.yml sao chép thiết lập của bạn? –

+0

Cũng vui lòng xem xét bao gồm một tập lệnh mẫu để tái tạo điều này. –

Trả lời

2

Đối với một tra cứu dns tốt hơn, bạn có thể xem xét sử dụng một lớp phủ mạng, như đã trình bày trong "Docker Overlay Networks: That was Easy"

Nó sử dụng một KV (Key/Value) lưu trữ các căn cứ trên Consul và một cụm đám nơi bạn có thể đăng ký các nút của mình.

Bạn có thể xây dựng một mạng overlay

eval "$(docker-machine env --swarm c0-master)" 
docker network create -d overlay myStack1 

Và sử dụng nó để chạy một hình ảnh:

docker run -d --name web --net myStack1 nginx 
docker run -itd --name shell1 --net myStack1 alpine /bin/sh 

Cả hai container sẽ được gắn vào cùng một mạng, và có thể phát hiện theo tên vùng chứa (bất kể thứ tự bắt đầu).
Hơn nữa, khi vùng chứa được khởi động lại, nó sẽ vẫn có thể phát hiện được mà không cần khởi động lại tầng.

+0

Cảm ơn bạn đã trả lời! Trường hợp sử dụng của tôi là ứng dụng đẳng cấu. Vì vậy, nó sử dụng cùng một js trên máy khách và trên máy chủ giao diện người dùng. Đây là kiến ​​trúc mà tôi đã đến: ** nginx **: phân phối các yêu cầu giữa các giao diện người dùng và máy chủ phụ trợ. ** dnsdock **: giải quyết 'app.com' và' api.app.com' thành nginx. ** giao diện người dùng **: sử dụng dnsdock để truy cập chương trình phụ trợ thông qua 'api.app.com'. Và tôi nên triển khai nó bằng cách sử dụng mạng docker như thế nào? Tôi có nên loại bỏ nginx và dnsdock và đặt tên vùng chứa phụ trợ thành 'api.app.com' không? Điều gì sẽ xảy ra nếu tôi quyết định sử dụng 'app.com/api' thay vì' api.app.com'? –

+0

@AliakseiTuzik nginx có vẻ là một ý tưởng hay. dnsdock sẽ được thay thế bởi lãnh sự trong câu trả lời của tôi. – VonC

Các vấn đề liên quan