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