У меня есть образ докера, который я хотел бы запустить через Mesos / Marathon.
Я использую сеть BRIDGE в докере, и я хотел бы передать «общедоступный» (то есть не сеть docker0 контейнера) адрес подчиненного / докер-хоста mesos, на котором запускается контейнер, в начальный контейнер через env var или param, поэтому я могу рекламировать этот IP-адрес в ответах приложения (приложение является узлом Cassandra, и я заполню broadcast_address
в cassandra.yaml с этим адресом)
Насколько я понимаю, я могу заставить Mesos перенаправлять любой конкретный порт (в настроенном диапазоне) по этому адресу обратно на адрес docker0 моего работающего контейнера. Если это правда, и я могу гарантировать, что экземпляр приложения (узел Cassandra) не будет перемещен с этого ведомого устройства, с парой ограничений, я могу иметь кластер Cassandra, запланированный мезо.
Мой вопрос: как мне получить IP-адрес ведомого (хоста докера) в экземпляре приложения Marathon при его запуске?
Вы не знаете IP-адрес, пока Marathon не найдет подходящий хост для задачи. Однако во время запуска задачи на подчиненном сервере Mesos некоторые свойства сохраняются в переменных ENV:
...
ULIMIT=-n 8192
HOST=slave01.example.com
MESOS_SLAVE_PID=slave(1)@192.168.1.2:5051
MARATHON_APP_RESOURCE_CPUS=0.1
MESOS_TASK_ID=dummy.eb6e1d9a-c2f0-11e5-a58b-00259057db2f
Если вас устраивает имя хоста, вы можете использовать HOST
переменной или извлеките IP-адрес из MESOS_SLAVE_PID
.
Если вы начнете mesos-slave
с участием --ip=192.168.1.2
, то оба HOST
и LIBPROCESS_IP
Переменная ENV будет установлена на адрес хоста. Для пакета Мезосфера:
echo "192.168.1.2" > /etc/mesos-slave/ip
и перезапустите раб.
Еще один вариант - разрешить IP-адрес агента внутри контейнера Docker:
AGENT_IP=$(getent hosts ${HOST} | awk '{ print $1 }')