如何在正在运行的docker容器上执行命令?

时间:2015-01-27 19:25:12

标签: hadoop docker boot2docker

我有一个运行hadoop的容器。我有另一个docker文件,其中包含Map-Reduce作业命令,如创建输入目录,处理默认示例,显示输出。第二个文件的基本映像是从第一个docker文件创建的hadoop_image。

修改

Dockerfile - 用于hadoop

 #base image is ubuntu:precise
 #cdh installation
 #hadoop-0.20-conf-pseudo installation
 #CMD to start-all.sh

start-all.sh

 #start all the services under /etc/init.d/hadoop-*

从此创建的hadoop基础图像。

Dockerfile2

 #base image is hadoop
 #flume-ng and flume-ng agent installation
 #conf change
 #flume-start.sh

flume-start.sh

#start flume services

我分别运行两个容器。它工作正常。但如果我跑

docker run -it flume_service

它启动了水槽并向我显示了一个bash提示符[/ bin / bash是flume-start.sh的最后一行]。我执行

hadoop fs -ls /

在第二个正在运行的容器中,我收到以下错误

ls:从514fa776649a / 172.17.5.188调用localhost:8020连接异常失败:java.net.ConnectException:连接被拒绝;有关详细信息,请参阅:http://wiki.apache.org/hadoop/ConnectionRefused

我理解我收到此错误,因为hadoop服务尚未启动。但我怀疑是我的第一个容器正在运行。我用它作为第二个容器的基本图像。那为什么我得到这个错误?我是否需要更改flume contianer上的hdfs-site.xml文件中的任何内容?

伪分布式模式安装。

有什么建议吗?

或者我需要暴露任何端口吗?如果是这样,请给我一个例子

编辑2

  iptables -t nat -L -n

我看到了

  sudo iptables -t nat -L -n
  Chain PREROUTING (policy ACCEPT)
  target     prot opt source               destination
  DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           ADDRTYPE match dst-

  Chain POSTROUTING (policy ACCEPT)
  target     prot opt source               destination
  MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-6
  MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24    masq ports: 1024-6
  MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24
  MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination
  DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8         ADDRTYPE match dst-

 Chain DOCKER (2 references)
 target     prot opt source               destination

在docker @ domian中。不在容器内。

修改    请参阅surazj'回答

下的最新评论

2 个答案:

答案 0 :(得分:0)

您是否尝试过连接容器?

例如,名为 hadoop 的容器正在psedo dist模式下运行。您想要调出另一个包含水槽的容器。您可以链接容器,如

 docker run -it --link hadoop:hadoop  --name flume ubuntu:14.04 bash

当你进入水槽容器时 - 输入 env 命令查看hadoop容器暴露的ip和端口。

从水槽容器中你应该可以做类似的事情。 (应该暴露hadoop容器上的端口)

$ hadoop fs -ls hdfs://<hadoop containers IP>:8020/

您获得的错误可能与某些没有在水槽上运行的hadoop服务有关。执行 jps 检查正在运行的服务。但是我想如果你在flume容器上正确设置了hadoop classpath,那么你可以运行上面的hdfs命令(-ls hdfs://:8020 /)而无需启动任何东西。但如果你想要

hadoop fs -ls /

在水槽容器上工作,那么你需要在水槽容器上启动hadoop服务。

在你的core-site.xml上添加 dfs.namenode.rpc-address ,这样namenode就会监听来自所有ip的连接

  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address</name>
    <value>0.0.0.0:8020</value>
  </property>

确保重新启动namenode和datanode

sudo /etc/init.d/hadoop-hdfs-namenode restart&amp;&amp; sudo /etc/init.d/hadoop-hdfs-datanode restart

然后你应该可以从没有连接错误的hadoop容器中执行此操作,例如

hadoop fs -ls hdfs://localhost:8020/
hadoop fs -ls hdfs://172.17.0.11:8020/

在链接的容器上。键入env以查看hadoop容器的公开端口

  

的env

你应该看到类似的东西 HADOOP_PORT_8020_TCP = TCP://172.17.0.11:8020

然后,您可以验证链接容器的连接。

  

telnet 172.17.0.11 8020

答案 1 :(得分:0)

我想我遇到了同样的问题。我要么不能通过hadoop命令启动hadoop namenode和datanode&#34; start-all.sh&#34;在docker1中。

这是因为它通过&#34; hadoop-daemons.sh&#34;启动了namenode和datanode。但它失败了。真正的问题是&#34; ssh&#34;在docker中不起作用。

所以,你可以做任何一次

  • (解决方案1):
    替换所有术语&#34; daemons.sh&#34; to&#34; daemon.sh&#34;在start-dfs.sh中, 而不是运行start-dfs.sh

  • (解决方案2):做

    $ HADOOP_PREFIX / sbin / hadoop-daemon.sh启动datanode $ HADOOP_PREFIX / sbin / hadoop-daemon.sh start namenode

您可以通过命令&#34; jps&#34;

看到datanode和namenode工作正常

问候。