暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker部署Nacos & CoreDNS 实现动态DNS功能

白粥笔记 2019-03-31
1519

本文通过Docker部署CoreDNS和Nacos-coredns-plugin测试Nacos 动态DNS功能

相关链接

  • coreDNS:官方指南、Github

  • Nacos:官网、Github

  • Nacos-coredns-plugin:Github

版本约定: 

Nacos:v1.0.0-RC2(Mar 22, 2019) 

CoreDNS:v1.2.6 

Nacos-coredns-plugin: 最新

1. 制作Docker镜像

为了兼容性考虑,我们直接采用nacos-coredns-plugin插件提供的编译脚本来构建Docker镜像。(该脚本会自动安装CoreDNS v1.2.6和相关依赖)

1.1 将Nacos-coredns-plugin下载到本地

  1. git clone https://github.com/nacos-group/nacos-coredns-plugin.git

1.2 修改接口版本【重点】

将文件"nacos-coredns-plugin/nacos/utilandcomms.go"中的Version = "Nacos-go-client:v0.1.0"修改为Version = "Nacos-DNS:v1.0.1";

插件会将该Version信息加入请求Nacos服务的request头信息中,服务端以此区分响应内容格式。

2. 编写Dockerfile

文件目录如下:

  1. - docker

  2. - nacos-coredns-plugin

  3. - Dockerfile (*当前创建*)

  4. - docker-compose.yml (*稍后创建*)

  5. - conf (*稍后创建*)

  6. - Corefile (*稍后创建*)

将工作目录切换到docker下,创建Dockerfile文件,加入如下内容:

  1. FROM golang:1.12


  2. ADD ./nacos-coredns-plugin /tmp/nacos-coredns-plugin


  3. # 编译构建

  4. RUN sh /tmp/nacos-coredns-plugin/bin/build.sh


  5. # 导出默认端口,tcp和udp的都要导出

  6. EXPOSE 53 53/udp


  7. VOLUME ["/etc/coredns/Corefile"]


  8. CMD ["/go/src/coredns/coredns", "-conf", "/etc/coredns/Corefile"]

然后,构建镜像

  1. docker build -t zzw/nacos-coredns .

3. 安装Nacos

在Nacos的release页面下载需要的包,采用单机形式启动Nacos服务。

  1. Linux/Unix/Mac

  2. 启动命令(standalone代表着单机模式运行,非集群模式):


  3. sh startup.sh -m standalone


  4. Windows

  5. 启动命令:


  6. cmd startup.cmd


  7. 或者双击startup.cmd运行文件。

启动后,在http://192.168.1.105:8848/nacos/index.html即可访问管理界面,默认账户信息:nacos#nacos。

4. 注册Nacos服务

在此通过Java client向Nacos注册服务,引入maven依赖:

  1. <dependency>

  2. <groupId>com.alibaba.nacos</groupId>

  3. <artifactId>nacos-client</artifactId>

  4. <version>1.0.0-RC2</version>

  5. </dependency>

编写注册代码:

  1. NamingService naming = NamingFactory.createNamingService("127.0.0.1:8848");


  2. Instance instance = new Instance();

  3. instance.setClusterName("KanBan");

  4. instance.setEnabled(true);

  5. instance.setHealthy(true);

  6. instance.setIp("192.168.0.105");

  7. instance.setPort(8848);

  8. instance.setServiceName("nacos.test.3");

  9. instance.setWeight(1);


  10. naming.registerInstance("nacos.test.3", instance);

  11. // 保持当前线程,使服务健康检测能顺利通过

  12. Thread.currentThread().sleep(999999999);

5. 通过docker-compose启动容器

编写docker-compose.yml文件:

  1. version: '3'


  2. services:

  3. coredns:

  4. image: zzw/nacos-coredns:latest

  5. container_name: coredns

  6. restart: always

  7. network_mode: "bridge"

  8. expose:

  9. - '53'

  10. - '53/udp'

  11. ports:

  12. - "53:53"

  13. - "53:53/udp"

  14. volumes:

  15. - ./conf/Corefile:/etc/coredns/Corefile

./conf/Corefile即为CoreDNS配置文件,内容如下:

  1. . {

  2. nacos {

  3. upstream /etc/resolv.conf

  4. nacos_server 192.168.1.105

  5. nacos_server_port 8848

  6. }

  7. log

  8. errors

  9. }

启动容器:

  1. docker-compose up


  2. #输出如下


  3. Recreating coredns ...

  4. Recreating coredns ... done

  5. Attaching to coredns

  6. coredns | log directory: /root/logs/nacos-go-client/

  7. coredns | register nacos plugin

  8. coredns | setup nacos plugin

  9. coredns | init nacos plugin...

  10. coredns | upstreams: [192.168.65.1:53]

  11. coredns | init nacos client.

  12. coredns | .:53

  13. coredns | 2019-03-31T02:49:01.374Z [INFO] CoreDNS-1.2.6

  14. coredns | 2019-03-31T02:49:01.374Z [INFO] linux/amd64, go1.12.1,

  15. coredns | CoreDNS-1.2.6

  16. coredns | linux/amd64, go1.12.1,

启动成功。

6. 测试

  • 在宿主机测试是否可以正确解析“nacos.test.3”域名:

  1. # 命令行输入

  2. dig @127.0.0.1 nacos.test.3


  3. # 解析结果

  4. ; <<>> DiG 9.10.6 <<>> @127.0.0.1 nacos.test.3

  5. ; (1 server found)

  6. ;; global options: +cmd

  7. ;; Got answer:

  8. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19338

  9. ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2


  10. ;; OPT PSEUDOSECTION:

  11. ; EDNS: version: 0, flags:; udp: 4096

  12. ;; QUESTION SECTION:

  13. ;nacos.test.3. IN A


  14. ;; ANSWER SECTION:

  15. nacos.test.3. 1 IN A 192.168.0.105


  16. ;; ADDITIONAL SECTION:

  17. _udp.nacos.test.3. 1 IN SRV 0 0 8848 .


  18. ;; Query time: 2 msec

  19. ;; SERVER: 127.0.0.1#53(127.0.0.1)

  20. ;; WHEN: Sun Mar 31 10:49:15 CST 2019

  21. ;; MSG SIZE rcvd: 105

  • 测试解析“www.baidu.com”

  1. # 命令行输入

  2. dig @127.0.0.1 www.baidu.com

  3. # 解析结果

  4. ; <<>> DiG 9.10.6 <<>> @127.0.0.1 www.baidu.com

  5. ; (1 server found)

  6. ;; global options: +cmd

  7. ;; Got answer:

  8. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40970

  9. ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1


  10. ;; OPT PSEUDOSECTION:

  11. ; EDNS: version: 0, flags:; udp: 4096

  12. ;; QUESTION SECTION:

  13. ;www.baidu.com. IN A


  14. ;; ANSWER SECTION:

  15. www.baidu.com. 376 IN CNAME www.a.shifen.com.

  16. www.a.shifen.com. 376 IN A 119.75.217.109

  17. www.a.shifen.com. 376 IN A 119.75.217.26


  18. ;; Query time: 47 msec

  19. ;; SERVER: 127.0.0.1#53(127.0.0.1)

  20. ;; WHEN: Sun Mar 31 10:49:59 CST 2019

  21. ;; MSG SIZE rcvd: 149

7. 常见问题

  1. 2019-03-29 10:59:32.570 ERROR failed to unmarshal json: {"count":1,"doms":{"public":["nacos.test.3"]}}json: cannot unmarshal object into Go struct field AllDomNames.doms of type []string

参考本章:1.2小结即可解决


文章转载自白粥笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论