如何使用RESTAPI知道容器名称

t8e9dugd  于 2021-06-21  发布在  Mesos
关注(0)|答案(5)|浏览(303)

我正在使用apachemesos+marathon+zookeeper部署我的rails应用程序。我需要在rails应用程序和其他容器之间共享数据。我在这里找到了一些关于马拉松的参考资料,如下所示:
马拉松/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”来分配名称。有办法解决吗?或者用另一种方式与马拉松分享容器中的体积?

icomxhvb

icomxhvb1#

您可以向应用程序添加约束,以将它们强制放到特定的主机上。
在一个简单的情况下,您可以执行以下操作将应用程序强制安装到特定主机上:

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

下一个选项引入属性。您可以使用一些自定义标记来标记已知数量的主机(比如3个)。
那么你的应用程序定义可以是这样的:

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

您将此添加到两个应用程序的应用程序定义中,从而在您标记的所有三个从属应用程序上运行每个应用程序的一个示例。
请参阅有关设置属性的参考文档。

qlvxas9a

qlvxas9a2#

您可以运行类似这样的操作来获取容器id docker ps --filter label=MESOS_TASK_ID=<mesos-task-id> -q

ac1kyiln

ac1kyiln3#

我的剧本是根据珊珊的剧本改编的。将hostname作为第一个参数,将marathon部署id列表作为其他参数。
我希望这对某人有帮助;)
我使用的是marathon0.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
6mw9ycah

6mw9ycah4#

答案可能会帮助其他正在寻找答案的人。
使用 docker inspect 并在json中搜索键值为“mesos\u task\u id”的环境设置。
现在你有了一个匹配的 CONTAINER_ID 以及 MESOS_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 Map


# !/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

希望这对你有帮助。

6mzjoqzu

6mzjoqzu5#

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

相关问题