3

我正在使用 Apache Mesos + 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”。有什么办法解决吗?或以其他方式与马拉松共享容器中的音量?

4

5 回答 5

3

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

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

现在你有一个匹配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 $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

希望这会帮助你。

于 2015-04-01T05:33:06.270 回答
2

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

在一个简单的情况下,您可以执行以下操作将应用程序强制到特定主机上:

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

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

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

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

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

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

于 2015-02-23T21:36:59.607 回答
0

你可以运行类似的东西来获取容器 ID

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

于 2017-04-25T20:10:24.673 回答
0

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

于 2017-08-09T10:00:41.310 回答
0

我的脚本基于 Shan 的脚本。将主机名作为第一个参数,将马拉松部署 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
于 2015-12-16T16:01:22.123 回答