如何连接在同一主机上运行的两个docker容器?

我有两个docker集装箱运行

docker ps 

结果

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0bfd25abbfc6 f_service:latest "/usr/local/start-fl 13 seconds ago Up 2 seconds 0.0.0.0:8081->8081/tcp flume 6a1d974f4e3e h_service:latest "/usr/local/start-al 2 minutes ago Up About a minute 0.0.0.0:8080->8080/tcp hadoop 

Hadoop服务在hadoop容器中运行[即datanode,namenode,jobtracker,tasktracker,secondarynamenode]

Flume服务正在使用flume contianer [即flume-agent]

我想在flume容器上运行hadoop命令[即hadoop fs -ls /]怎么做? 有任何想法吗?

我尝试链接,但我未能实现它。

运行命令为容器:

  docker run -it --name hadoop -p 8080:8080 h_service jps on hadoop container shows all hadoop services docker run -it -p 8081:8081 --name flume --link hadoop:hadoop f_service jps on flume shows jps and Application.[which is flume i guess] 

如果我在flume容器中执行任何hadoop命令,我得到以下错误

  mkdir: Call From 282fc55ec08d/172.17.5.236 to localhost:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org /hadoop/ConnectionRefused 

telnet localhost 8020

无法连接到远程主机。 同样为8080也。

netstat里面的水槽容器

  netstat -na Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path 

在hadoop容器显示netstat

  netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:49096 localhost:8020 TIME_WAIT tcp 0 0 localhost:49079 localhost:8020 ESTABLISHED tcp 0 0 localhost:8020 localhost:49079 ESTABLISHED tcp 0 0 c0c82bab5efd:54003 likho.canonical.com:80 TIME_WAIT tcp6 0 0 localhost:8021 localhost:40735 ESTABLISHED tcp6 0 0 localhost:40735 localhost:8021 ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] STREAM CONNECTED 9223040 unix 2 [ ] STREAM CONNECTED 9223013 unix 2 [ ] STREAM CONNECTED 9222782 unix 2 [ ] STREAM CONNECTED 9222116 unix 2 [ ] STREAM CONNECTED 9221761 unix 2 [ ] STREAM CONNECTED 9221758 unix 2 [ ] STREAM CONNECTED 9221302 unix 2 [ ] STREAM CONNECTED 9221284 unix 2 [ ] STREAM CONNECTED 9220884 unix 2 [ ] STREAM CONNECTED 9220877 

凡localhost:8020,我猜8020是来自core-site.xml的规范

这一个有一个简单的解决scheme。 首先,如果你想连接到你的hadoop容器的8020端口,你应该确保这个端口也是暴露的。 其次,这些容器都有自己的回送接口(localhost)和IP地址。 它们通过网桥docker0连接到主机的eth0接口。 因此,您需要使用Docker注入到水槽容器中的IP地址。

所以这些将正确启动容器:

 docker run -it --name hadoop --expose 8080 --expose 8020 h_service docker run -it --name flume --link hadoop:had00p -p 8081:8081 f_service 

但是你需要告诉flume连接到“had00p”而不是“localhost”的hadoop。 我在这里使用了had00p,只是为了区分容器内部的别名与容器运行hadoop的容器名称。

这是一个简单的例子:

 docker run -d --name container_a --expose 8080 busybox:latest nc -l 0.0.0.0 8080 docker run --rm --link container_a:dep_alias busybox:latest env docker run --rm --link container_a:dep_alias busybox:latest cat /etc/hosts 

当Docker创build应用程序链接时,它会注入许多环境variables,并将主机名添加到链接容器的/ etc / hosts文件中。 如果禁用了容器间通信,它还将添加防火墙规则以允许两个容器之间的通信。