Docker容器非常轻量,系统开销非常少,比VMware或者VirtualBox用起来方便,部署起来也非常容易。官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是:
1、Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器
2、宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口
这里以CDNS为例,CDNS是一个用于避免DNS污染的程序,通过CDNS可以把你的计算机变成一个抗污染的DNS服务器提供给局域网使用。Docker镜像下载地址:https://hub.docker.com/r/alexzhuo/cdns/
原理是在Docker容器中启动CDNS,监听53端口,Docker容器的IP地址为172.12.0.2,宿主机把5053端口映射到Docker容器上,访问宿主机的127.0.0.1:5053就相当于访问Docker的53端口,所以Docker的启动方法是:
sudo docker run -itd -p 0.0.0.0:5053:53/udp --name=CureDNS alexzhuo/cdns cdns -c /etc/cdns.config.json
这样我们使用dig工具通过5053端口查询DNS就是无污染的DNS了,过程如下:
alex@alex-Lenovo-U310:~$ dig www.facebook.com @127.0.0.1 -p 5053
; DiG 9.10.3-P4-Ubuntu <<>> www.facebook.com @127.0.0.1 -p 5053
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9522
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.facebook.com. IN A
;; ANSWER SECTION:
www.facebook.com. 1550 IN CNAME star-mini.c10r.facebook.com.
star-mini.c10r.facebook.com. 30 IN A 31.13.95.36
;; AUTHORITY SECTION:
c10r.facebook.com. 2010 IN NS a.ns.c10r.facebook.com.
c10r.facebook.com. 2010 IN NS b.ns.c10r.facebook.com.
;; ADDITIONAL SECTION:
a.ns.c10r.facebook.com. 2439 IN A 69.171.239.11
a.ns.c10r.facebook.com. 2439 IN AAAA 2a03:2880:fffe:b:face:b00c:0:99
b.ns.c10r.facebook.com. 3351 IN A 69.171.255.11
b.ns.c10r.facebook.com. 1253 IN AAAA 2a03:2880:ffff:b:face:b00c:0:99
;; Query time: 47 msec
;; SERVER: 127.0.0.1#5053(127.0.0.1)
;; WHEN: Mon Apr 10 16:21:46 CST 2017
;; MSG SIZE rcvd: 213
这里假设我们的宿主机IP是192.168.12.107
如果现在出现另外一台局域网计算机,IP地址为192.168.12.113,它想把宿主机当成DNS服务器,那么我们就需要在192.168.12.113这台计算机上访问192.168.12.107:5053来查询DNS,dig命令如下
dig www.facebook.com @192.168.12.107 -p 5053