docker挂载文件的更新问题

将宿主机配置文件挂载到容器,在宿主机修改配置文件,但容器内挂载的文件并未发生变化,直至docker重启。

记得不是这样的。起初以为是版本的原因。于是在最新版docker上做了测试,问题依旧。

只好Google之。最后从docker issue上找到了答案:
docker挂载文件基于inode。vim等编辑工具保存文件时,并非直接保存,而是将一份新的临时文件覆盖了旧文件。对于inode而言,原文件并未被修改。

解决方案有三:
1、换用nano等直接更新文件的编辑工具
2、改为挂载目录。
3、修改vim配置,添加:set backupcopy=yes

参考:
https://github.com/docker/docker/issues/15793
http://www.ruanyifeng.com/blog/2011/12/inode.html

利用docker部署Hadoop单节点环境

之前早就编译好了几个hadoop镜像,含2.4.1、2.6.0、2.7.0三个版本。但一直未能成功地部署好docker hadoop环境。这个周末终于能静下心来,做成这件小事。
网络上所流传的docker hadoop部署方式,大都是一个容器一个节点(即master或slave)。我这里采用的是一个容器一个服务的方式。
必须要强调,这只是第一步。多节点部署方式还待研究。

先从镜像服务器拉取我制作的hadoop镜像。我所编译的hadoop镜像的hadoop原生库为64位,jdk为openjdk-7-jdk,Dockerfile见这里。这次我使用的版本是2.6.0。
docker pull wencan/hadoop:2.6.0

创建本地配置文件目录,和数据目录
mkdir conf
mkdir data
拷贝hadoop etc/hadoop目录下的全部配置文件到conf目录下,配置几个关键项。如果本地没有hadoop包,可以创建一个hadoop容器,利用docker cp从容器拷贝出默认的配置文件。
主要配置可见这里。另外还需要需要的配置的为namenode的数据目录,和datanode的数据目录,这个可以参考这里

格式化namenode数据目录
这里必须使用默认的桥接网络,否则会出错
docker run –rm -it -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data wencan/hadoop:2.6.0 hdfs namenode -format

运行namenode,使用宿主网络,后面相同
docker run -d –name hadoop_namenode -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data –net host wencan/hadoop:2.6.0 hdfs namenode

运行datanode
docker run -d –name hadoop_data -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data –net host wencan/hadoop:2.6.0 hdfs datanode

可以登陆http://localhost:50070查看,可以看到一个datanode节点。

运行resourcemanager
docker run -d –name hadoop_resourcemanager -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 yarn resourcemanager

运行nodemanager
docker run -d –name hadoop_nodemanager -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 yarn nodemanager

可以登陆http://localhost:8088查看,可以在nodes页面看到一个nodemanager节点

运行historyserver
docker run -d –name hadoop_historyserver -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 mapred historyserver

创建/input/wordcount目录,并将本地配置文件复制过去,作为稍后wordcount的输入文件
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 /bin/bash -c ‘hdfs dfs -mkdir -p /input/wordcount && hdfs dfs -copyFromLocal /etc/hadoop/* /input/wordcount’

列出刚才复制到hdfs的文件。也可以在50070查看。
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hdfs dfs -ls /input/wordcount/

执行wordcount,输入目录为/input/wordcount,输出目录为/output/wordcount
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /input/wordcount /output/wordcount

输出mapreduce的计算结果
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hdfs dfs -cat /output/wordcount/*

参考:
Hadoop MapReduce Next Generation – Setting up a Single Node Cluster.
配置运行hadoop