上个星期学习了一下docker,写了一个伪分布式的Dockerfile。
通过--link
的方式master能访问slaver,毕竟slaver的相关信息已经被写入到master的hosts文件里面去了嘛!理所当然认为,直接把master的hosts文件全部复制一份到所有slaver节点问题就解决了。
等真正操作的时刻,发现不是那么回事,docker容器不给修改hosts文件!!(2016-1-7 14:18:11 注: Docker 1.6.2已经可以修改/etc/hosts了!重启后hosts的变更也没了,囧)
错误实现
首先,看下不当的操作:
1 2 3 4 5 6 7 8 9 10 |
|
此时,通过--link
连接方式,master的hosts中已经包括了slaver1和slaver2,按照正常的路子,登录master拷贝其hosts到slaver节点,一切就妥妥的了。现实是残酷的:
1 2 |
|
DNS完美解决问题
首先需要在宿主机器上安装dns服务器,bind不多说比较麻烦。这里参考网上人家解决方式,使用dnsmasq来搭建DNS服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
通过dig可以查看当前的DNS服务器你已经修改为localhost了。然后启动docker容器来搭建环境。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
节点互通后,后面的步骤都类似了,ssh无密钥通信,格式化namenode,启动等等。
遇到的问题
- 一开始我把配置文件放在/root目录下,dnsmasq总是不起作用。最后放到/etc目录就可以,不知道啥子问题。
- 配置dns启动docker容器后,如果不起作用看下
/etc/resolv.conf
。如果互ping不同,去掉resolv的search localhost
再试下。
DNS可以正常工作的配置:
1 2 3 4 5 6 7 8 9 10 |
|
如果还是不行的话,关掉防火墙然后重启下docker服务: service iptables stop; service docker restart
如果要访问外网,也可以条件其他的DNS服务解析:
1 2 3 |
|
常用命令
1 2 3 |
|
参考
–END