Como conectar dois contêineres docker rodando no mesmo host?

4

Eu tenho dois contêineres docker em execução

   docker ps

resultados

  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

Os serviços do Hadoop estão sendo executados no contêiner hadoop [por exemplo, datanode, namenode, jobtracker, tasktracker, secondarynamenode]

Os serviços de fluxo estão sendo executados no container de flume [por exemplo, flume-agent]

Eu quero rodar comandos do hadoop no container flume [ou seja, hadoop fs -ls /] Como fazer isso? Alguma idéia?

Eu tentei vincular, mas não consegui.

EXECUTAR COMMAND para os contêineres:

  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]

Se eu executar qualquer comando hadoop dentro do container flume, estou recebendo o seguinte erro

 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

incapaz de se conectar ao remotehost. mesmo para 8080 também.

netstat dentro do recipiente de flume

 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

netstat no contêiner do hadoop mostra

    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

Onde localhost: 8020, eu acho que 8020 é da especificação do core-site.xml

    
por Gops AB 29.01.2015 / 07:16

1 resposta

4

Este tem uma solução simples. Primeiro, se você quiser se conectar à porta 8020 do seu contêiner hadoop, verifique se essa porta também está exposta. Em segundo lugar, esses contêineres possuem sua própria interface de loopback (localhost) e endereços IP. Eles estão conectados por meio do docker0 da rede da bridge à interface eth0 do host. Portanto, você precisa usar o endereço IP que o Docker injeta no contêiner do flume.

Então, eles iniciarão os contêineres corretamente:

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

Mas você precisará dizer ao flume para se conectar ao hadoop em "had00p" em vez de "localhost". Eu usei o had00p aqui apenas para distinguir o alias que ele terá dentro do container do nome do container que você deu ao container rodando hadoop.

Aqui está um exemplo simples:

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

Quando o Docker cria links de aplicativos, ele injeta várias variáveis de ambiente e adiciona um nome de host ao arquivo / etc / hosts do contêiner vinculado. Ele também adicionará regras de firewall para permitir a comunicação entre os dois contêineres se você tiver a comunicação entre contêineres desativada.

    
por 09.02.2015 / 01:34

Tags