如何知道容器名称与马拉松休息 API

how know container name with marathon rest API

我正在使用 Apache Mesos + Marathon + Zookeeper 来部署我的 rails 应用程序。 我需要在 rails 应用程序和其他容器之间共享数据。我在这里找到了一些关于马拉松的参考,如下所示:

marathon/docs/native-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"。有解决办法吗?或其他与马拉松共享容器体积的方法?

您可以将 constraints 添加到您的应用程序中,以强制它们进入特定的主机。

在一个简单的例子中,您可以执行类似这样的操作来强制将应用程序连接到特定主机:

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

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

那么您的应用定义可能如下所示:

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

您会将此添加到您的两个应用程序的应用程序定义中,从而在您标记的所有三个从属设备上产生每个 运行 的一个实例。

参见 reference doc 设置属性。

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

使用 docker inspect 并在 JSON 中搜索键值为“MESOS_TASK_ID”的环境设置。

现在你有一对匹配的 CONTAINER_IDMESOS_TASK_ID

希望对您有所帮助。

更新

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

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

使用以下代码,获取 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 }'))
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 }')
printf "$host\t$container_id\t$mesos_id\n"
done
done

希望对您有所帮助。

我的剧本是根据山的剧本改编的。 将主机名作为第一个参数,并将马拉松部署 ID 列表作为其他参数。

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

我使用的是 marathon 0.11.1,对于这个版本,mesos 容器名称是 volumes-from 参数所需的值。

#!/bin/bash

find_mesos_id () {
  # Parameters
  HOST=""

  # All running containers
  CONTAINERS=`docker -H $HOST:2375 ps | sed 1d | awk '{print }'`
  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 }' | awk -F '\/' '{print }')
     MESOS_CONTAINER_NAME=$(docker -H $HOST:2375 inspect $i | grep MESOS_CONTAINER_NAME | awk -F '[="]' '{print }')

     # Print MESOS_ID only for desired container
     if [[ $MARATHON_APP_ID =  ]]; 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  ${!i})
      if [[ $i -ne $# ]]; then
        printf ", "
      else 
        echo
      fi  
    done
fi

您可以运行获取容器 ID

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

找回你的真实需求,我不认为使用 container_id 与其他容器通信比使用 ipaddress 更好。虽然你正在使用 zookeeper,但你可以将它用作名称服务服务器——当 "rails app container" 启动时,它可以在特定节点的 zk 中注册自己,然后其他容器中的其他应用程序可以在那里找到他们想要的东西.