如何用马拉松API知道容器名称

我正在使用Apache Mesos + Marathon + Zookeeper来部署我的Rails应用程序。 我需要轨道应用程序和其他容器之间的共享数据。 我在这里find一些参考,用马拉松来做:

马拉松/文档/母语docker.html

{ "id": "privileged-job", "container": { "docker": { "image": "mesosphere/inky" "privileged": true, "parameters": [ { "key": "hostname", "value": "a.corp.org" }, { "key": "volumes-from", "value": "another-container" }, { "key": "lxc-conf", "value": "..." } ] }, "type": "DOCKER", "volumes": [] }, "args": ["hello"], "cpus": 0.2, "mem": 32.0, "instances": 1 } 

但我找不到一种方法来发现我的Rails应用程序容器的名称,因为马拉松分配名称的格式为:“mesos-uuid”。 任何想法来解决它? 或另一种方式来与马拉松容器共享容量?

您可以添加约束到您的应用程序强制他们到特定的主机。

在一个简单的情况下,你可以做这样的事情来强制一个应用程序到特定的主机:

 { "instances": 1, "constraints": [["hostname", "LIKE", "worker-1"]] } 

下一个选项带来属性。 您可以使用一些自定义标签来标记已知数量的主机(比方说3)。

那么你的应用定义可能是这样的:

 { "instances": 3, "constraints": [ ["hostname", "UNIQUE"], ["your-custom-tag", "GROUP_BY"] ] } 

您可以将其添加到您的两个应用程序的应用程序定义中,从而在您标记的所有三个从属服务器上运行每个应用程序的一个实例。

请参阅设置属性的参考文档 。

答案可能会帮助其他正在寻找它的人。

使用docker inspect并在键值“ MESOS_TASK_ID ”中searchJSON中的环境设置。

现在你有一个匹配的CONTAINER_IDMESOS_TASK_ID对。

希望这可以帮助。

UPDATE

为了以自动的方式确定,首先确保docker守护进程可以被远程访问。 注意:这可能会引起安全问题

编辑/etc/default/docker DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375"并添加DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375"并重新启动DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375" – 在所有的mesos slave上。

使用以下代码获取MESOS_SLAVE CONTAINER_ID MESOS_TASK_ID映射

 #!/bin/bash HOSTS=($(curl -s -X GET -H "Accept: text/plain" http://mesosmaster:8080/v2/tasks | tail -n1 | cut -f3-)) hosts=() for i in "${HOSTS[@]}" do hosts+=($(echo $i | awk -F":" '{print $1}')) done host=($(printf "%s\n" "${hosts[@]}" | sort -u)) for host in "${host[@]}" do INSTANCES=($(docker -H $host:2375 ps -q)) for container_id in "${INSTANCES[@]}" do mesos_id=$(docker -H $host:2375 inspect $container_id | grep MESOS_TASK_ID | awk -F '[="]' '{print $3}') printf "$host\t$container_id\t$mesos_id\n" done done 

希望这会帮助你。

我的脚本基于单的脚本。 将主机名称作为第一个参数,并将马拉松部署ID列表作为其他参数。

我希望这对某人有帮助;)

我正在使用马拉松0.11.1,在此版本中,mesos容器名称是volume-from参数所需的值。

 #!/bin/bash find_mesos_id () { # Parameters HOST="$1" # All running containers CONTAINERS=`docker -H $HOST:2375 ps | sed 1d | awk '{print $1}'` CONTAINERS_ARRAY=($CONTAINERS) # for each get MARATHON_ID & MESOS_ID for i in "${CONTAINERS_ARRAY[@]}" do MARATHON_APP_ID=$(docker -H $HOST:2375 inspect $i | grep MARATHON_APP_ID | awk -F '[="]' '{print $3}' | awk -F '\/' '{print $2}') MESOS_CONTAINER_NAME=$(docker -H $HOST:2375 inspect $i | grep MESOS_CONTAINER_NAME | awk -F '[="]' '{print $3}') # Print MESOS_ID only for desired container if [[ $MARATHON_APP_ID = $2 ]]; then printf "{ \"key\": \"volumes-from\", \"value\": \"%s\" }" $MESOS_CONTAINER_NAME fi done } if [ "$#" -lt 2 ]; then echo "USAGE: bash gen-data-volumes.sh <host> [<marathon-id>]" printf "This script takes at least two arguments (%d given).\n" $# echo "exit 1." exit 1; fi if [ "$#" -gt 1 ]; then for ((i=2;i<$#+1;i++)) do printf "%s" $(find_mesos_id $1 ${!i}) if [[ $i -ne $# ]]; then printf ", " else echo fi done fi 

你可以运行一些东西来获取Container Id

docker ps --filter label=MESOS_TASK_ID=<mesos-task-id> -q

回到你的真正需求,我不认为使用container_id与其他容器(而不是ipaddress)沟通更好。 虽然您使用的是zookeeper,但您可以将其用作名称服务服务器 – 当“rails应用程序容器”启动时,它可以在特定节点的zk中注册自己,然后其他容器中的其他应用程序可以在其中find他们想要的内容。