Как соединить два док-контейнера, работающих на одном хосте?

У меня работает два докера

   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 [то есть, дата данных, namenode, JobTracker, TaskTracker, вторичный namenode]

Службы Flume работают на основе Contier Flume [т.е. Flume-Agent]

Я хочу запускать команды hadoop на контейнере flume.[Т.е. hadoop fs -ls /] Как это сделать? Есть идеи?

Я пытался связать, но мне не удалось этого добиться.

RUN COMMAND для контейнеров:

  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]

Если я выполняю какие-либо команды hadoop внутри контейнера Flume, я получаю следующую ошибку

 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

netstat на контейнерных шоу hadoop

    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

1 ответ

У этого есть простое решение. Во-первых, если вы хотите подключиться к порту 8020 вашего контейнера hadoop, вы должны убедиться, что этот порт также открыт. Во-вторых, каждый из этих контейнеров имеет свой собственный интерфейс обратной связи (localhost) и IP-адреса. Они подключены через мостовую сеть docker0 к интерфейсу eth0 хоста. Итак, вам нужно использовать IP-адрес, который Docker вводит в контейнер flume.

Таким образом, они будут запускать контейнеры правильно:

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 для подключения к hadoop по адресу "had00p" вместо "localhost". Я использовал здесь 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 создает ссылки приложений, он внедряет ряд переменных среды и добавляет имя хоста в файл /etc/hosts связанного контейнера. Также будут добавлены правила брандмауэра, чтобы разрешить связь между двумя контейнерами, если у вас отключена связь между контейнерами.

Другие вопросы по тегам