Назад | Перейти на главную страницу

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

у меня есть работают два докер-контейнера

   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 [например, узел данных, узел имени, средство отслеживания заданий, средство отслеживания задач, узел вторичного имени]

Сервисы Flume работают на контейнере flume [например, flume-agent]

Я хочу запускать команды hadoop в контейнере flume. [Например, 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]

Если я выполняю какие-либо команды 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

У этого есть простое решение. Во-первых, если вы хотите подключиться к порту 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 связанного контейнера. Он также добавит правила брандмауэра, чтобы разрешить связь между двумя контейнерами, если у вас отключена связь между контейнерами.