首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在正在运行的码头容器上执行命令?

如何在正在运行的码头容器上执行命令?
EN

Stack Overflow用户
提问于 2015-01-27 19:25:12
回答 2查看 3K关注 0票数 0

我有个集装箱在运行hadoop。我有另一个docker文件,其中包含Map-还原作业命令,例如创建输入目录、处理默认示例、显示输出。第二个文件的基本图像是从第一个坞文件创建的hadoop_image。

编辑

Dockerfile - for hadoop

代码语言:javascript
复制
 #base image is ubuntu:precise
 #cdh installation
 #hadoop-0.20-conf-pseudo installation
 #CMD to start-all.sh

start-all.sh

代码语言:javascript
复制
 #start all the services under /etc/init.d/hadoop-*

由此创建的hadoop基本映像。

Dockerfile2

代码语言:javascript
复制
 #base image is hadoop
 #flume-ng and flume-ng agent installation
 #conf change
 #flume-start.sh

flume-start.sh

代码语言:javascript
复制
#start flume services

我把这两个集装箱分开管理。效果很好。但如果我跑了

代码语言:javascript
复制
docker run -it flume_service

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

代码语言:javascript
复制
hadoop fs -ls /

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

ls:从514fa776649a/172.17.5.188呼叫本地主机:8020连接异常失败: java.net.ConnectException: connection拒绝;有关详细信息,请参阅:http://wiki.apache.org/hadoop/ConnectionRefused

据我所知,由于hadoop服务还没有启动,所以我收到了这个错误。但我怀疑的是我的第一个集装箱正在运行。我使用这个作为第二个容器的基本图像。那我为什么要犯这个错误?我是否需要更改flume contianer上的hdfs-site.xml文件中的任何内容?

伪分布式模式安装。

有什么建议吗?

或者我是否需要公开任何端口,就像这样?如果有的话,请给我举个例子。

编辑2

代码语言:javascript
复制
  iptables -t nat -L -n

我明白了

代码语言:javascript
复制
  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

它在码头@domian。不是在容器里。

编辑见surazj答复下面的最后评论

EN

回答 2

Stack Overflow用户

发布于 2015-01-27 19:41:27

你试过连接容器吗?

例如,名为hadoop的容器在psedo模式下运行。你想要拿出另一个装有水槽的容器。您可以将容器链接为

代码语言:javascript
复制
 docker run -it --link hadoop:hadoop  --name flume ubuntu:14.04 bash

当您进入flume容器时,输入env命令来查看由hadoop容器公开的ip和端口。

从水槽容器里你应该可以做一些类似的事情。(应公开hadoop容器上的端口)

代码语言:javascript
复制
$ hadoop fs -ls hdfs://<hadoop containers IP>:8020/

您所得到的错误可能与某些hadoop服务没有在flume上运行有关。执行jps检查服务运行情况。但是我认为,如果在flume容器上正确设置了,那么您可以在不启动任何操作的情况下运行上面的-ls命令( hdfs://:8020/)。但如果你想

代码语言:javascript
复制
hadoop fs -ls /

要处理flume容器,还需要在flume容器上启动hadoop服务。

在核心站点上添加这样的dfs.namenode.rpc-address,这样namenode就可以监听来自所有ip的连接

代码语言:javascript
复制
  <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 namenode重新启动& sudo /etc/init.d/hadoop重新启动

那么您应该能够在hadoop容器中完成此操作,而不会出现连接错误,例如

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

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

环境

您应该会看到类似HADOOP_PORT_8020_TCP=tcp://172.17.0.11:8020之类的内容。

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

telnet 172.17.0.11 8020

票数 0
EN

Stack Overflow用户

发布于 2015-10-19 11:50:43

我想我也遇到了同样的问题。我不能通过docker1中的hadoop命令" start -all.sh“启动和datanode。

这是因为它通过"hadoop-daemons.sh“启动namenode和datanode,但失败了。真正的问题是"ssh“不是在码头工作。

所以,你可以

  • (解决方案1): 将start-dfs.sh中的所有术语"daemons.sh“替换为"daemon.sh”,而不是运行start-dfs.sh。
  • (解决方案2):

$hadoop_前缀/sbin/hadoop-daemon.sh启动datanode $hadoop_前缀/sbin/hadoop-daemon.sh启动namenode

您可以看到datanode和namenode通过命令"jps“运行良好。

致以问候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28178408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档