2014-04-11 17 views
8

Tôi đang cố gắng thiết lập vùng chứa docker dnsmasq để tôi có thể chứa tất cả vùng chứa docker của mình tra cứu tên miền thay vì có IP được mã hóa cứng (nếu chúng nằm trên cùng một máy chủ). Điều này khắc phục sự cố với thực tế là các vùng chứa one cannot alter the /etc/hosts file in docker và điều này cho phép tôi dễ dàng cập nhật tất cả các vùng chứa của mình trong một lần bằng cách thay đổi một tệp duy nhất mà vùng chứa dnsmasq tham chiếu.Thiết lập Docker Dnsmasq

Có vẻ như ai đó đã thực hiện công việc khó khăn cho tôi và tạo một dnsmasq container. Thật không may, nó không phải là "làm việc" cho tôi. Tôi đã viết một kịch bản bash để bắt đầu container như hình dưới đây:

name="dnsmasq_" 
timenow=$(date +%s) 
name="$name$timenow" 

sudo docker run \ 
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ 
--name=$name \ 
-p='127.0.0.1:53:5353/udp' \ 
-d sroegner/dnsmasq 

Trước khi chạy đó, tôi tạo thư mục dnsmasq.hosts và chèn một tập tin bên trong nó gọi là hosts.txt với các nội dung sau:

192.168.1.3 database.mydomain.com 

Đáng tiếc là bất cứ khi nào tôi cố gắng ping tên miền từ bên trong:

  • chủ nhà
  • các dnsmasq chứa
  • khác chứa trên cùng một máy chủ

tôi luôn luôn nhận được thông báo lỗi ping: unknown host.

tôi đã cố gắng bắt đầu container dnsmasq không có chế độ daemon để tôi có thể gỡ lỗi sản lượng của nó, đó là dưới đây:

dnsmasq: started, version 2.59 cachesize 150 
dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN 
dnsmasq: reading /etc/resolv.dnsmasq.conf 
dnsmasq: using nameserver 8.8.8.8#53 
dnsmasq: read /etc/hosts - 7 addresses 
dnsmasq: read /dnsmasq.hosts//hosts.txt - 1 addresses 

Tôi đoán rằng tôi đã không quy định các tham số -p một cách chính xác khi bắt đầu container. Ai đó có thể cho tôi biết những gì nó nên được cho container docker khác để tra cứu DNS, hoặc cho dù những gì tôi đang cố gắng làm là thực sự không thể?

Trả lời

9

Việc xây dựng kịch bản cho các dịch vụ Docker dnsmasq cần phải thay đổi để ràng buộc để IP công cộng của máy chủ, mà trong trường hợp này là 192.168.1.12 trên giao diện eth0 của tôi

#!/bin/bash 

NIC="eth0" 

name="dnsmasq_" 
timenow=$(date +%s) 
name="$name$timenow" 

MY_IP=$(ifconfig $NIC | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}') 


sudo docker run \ 
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ 
--name=$name \ 
-p=$MY_IP:53:5353/udp \ 
-d sroegner/dnsmasq 

Trên host (trong trường hợp này là ubuntu 12), bạn cần cập nhật tệp resolv.conf hoặc/etc/network/interfaces để bạn đã đăng ký thiết bị IP công cộng (eth0 hoặc eth1) làm máy chủ định danh.

enter image description here

Bạn có thể muốn thiết lập một máy chủ tên thứ để được google cho bất cứ khi nào container không hoạt động, bằng cách thay đổi dòng để được dns-nameservers xxx.xxx.xxx.xxx 8.8.8.8 Ví dụ: không có dấu phẩy hoặc dòng khác.

Sau đó, bạn cần khởi động lại dịch vụ mạng sudo /etc/init.d/networking restart nếu bạn cập nhật tệp/etc/network/interfaces để tự động cập nhật tệp /etc/resolve.conf mà trình gắn kết sẽ sao chép vào vùng chứa trong khi tạo.

Bây giờ khởi động lại tất cả các container của bạn

  • sudo docker stop $CONTAINER_ID
  • sudo docker start $CONTAINER_ID

Điều này làm cho các file /etc/resolv.conf họ cập nhật để chúng trỏ tới các thiết lập máy chủ tên mới.

Tra cứu DNS trong tất cả các vùng chứa docker (mà bạn đã tạo từ khi thực hiện các thay đổi) giờ đây sẽ hoạt động bằng cách sử dụng vùng chứa dnsmasq của bạn! Một lưu ý phụ, điều này có nghĩa là các thùng chứa docker trên các máy chủ khác cũng có thể tận dụng dịch vụ dnsmasq của bạn trên máy chủ này miễn là cài đặt máy chủ tên của máy chủ được đặt thành sử dụng IP công cộng của máy chủ này.

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