Docker 如何使用RESTAPI了解容器名称

Docker 如何使用RESTAPI了解容器名称,docker,mesos,mesosphere,marathon,Docker,Mesos,Mesosphere,Marathon,我正在使用ApacheMesos+Marathon+Zookeeper部署我的rails应用程序。 我需要在rails应用程序和其他容器之间共享数据。我在这里找到了一些关于马拉松的参考资料,如下所示: 但我找不到一种方法来发现我的rails应用程序容器的名称,因为我用“mesos uuid”格式分配名称。有办法解决吗?或者通过marathon共享容器中的卷的另一种方式?您可以添加到应用程序中,强制将其添加到特定主机上 在一个简单的情况下,您可以这样做,将应用程序强制安装到特定主机上: { "

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

但我找不到一种方法来发现我的rails应用程序容器的名称,因为我用“mesos uuid”格式分配名称。有办法解决吗?或者通过marathon共享容器中的卷的另一种方式?

您可以添加到应用程序中,强制将其添加到特定主机上

在一个简单的情况下,您可以这样做,将应用程序强制安装到特定主机上:

{
 "instances": 1,
 "constraints": [["hostname", "LIKE", "worker-1"]]
}
下一个选项将引入属性。 您可以使用一些自定义标记来标记已知数量的主机(比如3台)

然后,您的应用程序定义可能如下所示:

{
 "instances": 3,
 "constraints": [
   ["hostname", "UNIQUE"],
   ["your-custom-tag", "GROUP_BY"]
 ]
}
您可以将其添加到两个应用程序的应用程序定义中,从而在您标记的所有三个从属应用程序上运行每个应用程序的一个实例


请参阅“设置属性”上的a。

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

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

现在您有了一个匹配的
CONTAINER\u ID
MESOS\u TASK\u ID

希望这有帮助

更新

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

编辑
/etc/default/docker
并添加
docker\u OPTS=“-Hunix:///var/run/docker.sock -Htcp://0.0.0.0:2375“
并在所有mesos从机上重新启动docker

使用以下代码获取
MESOS\u从属容器\u ID MESOS\u任务\u 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列表作为其他参数

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

我使用的是marathon 0.11.1,在这个版本中,mesos容器名称是volumes 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
#/bin/bash
查找介观id(){
#参数
HOST=“$1”
#所有流动容器
CONTAINERS=`docker-H$HOST:2375 ps | sed 1d | awk'{print$1}'`
容器\数组=($CONTAINERS)
#每次获得马拉松ID和MESOS ID
对于“${CONTAINERS\u ARRAY[@]}”中的i
做
马拉松应用程序ID=$(docker-H$HOST:2375检查$i | grep MARATHON应用程序ID | awk-F'[=”]'{print$3}'\/'{print$2}')
MESOS|u CONTAINER_NAME=$(docker-H$HOST:2375 inspect$i | grep MESOS_CONTAINER_NAME | awk-F'[=”]“{print$3}”)
#仅打印所需容器的MESOS_ID
如果[$MARATHON\u APP\u ID=$2]];则
printf“{\“key\”:“volumes from\”,“value\”:\“%s\”}“$MESOS\u CONTAINER\u NAME
fi
完成
}   
如果[“$#”-lt 2];然后
echo“用法:bash gen-data-volumes.sh[]”
printf“此脚本至少接受两个参数(%d)。\n”$#
回显“退出1”
出口1;
fi
如果[“$#”-gt 1];然后

对于((i=2;i您可以运行类似的操作来获取容器Id


docker ps--filter label=MESOS\u TASK\u ID=-q

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

thks@Shan,但我需要一种自动方式来发现容器ID或MESOS任务ID。@kikicarbonell,我目前正在处理它(基于Python的脚本),它将在上查询Marathon REST APIhtttp://marathon:8080/v2/tasks 并读取
appId
id
值(键
id
存储
MESOS\u任务id
)。然后在所有现有的docker上运行
docker inspect
命令,匹配
MESOS_任务ID
,并生成一个
容器ID
对。我将共享一次done@kikicarbonell,现在,您可以使用我在上面的答案中添加的shell脚本。由于工作负载,我无法使用Python脚本。而且我在p方面非常差在Python中处理JSON。当然,完成后我会在这里分享。我不知道这是如何回答这个问题的。有人能解释一下吗?
#!/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