如何知道容器名称与马拉松休息 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_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
映射
#!/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 中注册自己,然后其他容器中的其他应用程序可以在那里找到他们想要的东西.
我正在使用 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_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
映射
#!/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 中注册自己,然后其他容器中的其他应用程序可以在那里找到他们想要的东西.