翻译https://mesosphere.github.io/marathon/docs/application-basics.html
在marathon中,应用是一个完整的概念。每个应用是一个典型的长运行的服务,这个服务有很多实例,并且是运行在多个主机上。
Hello Marathon:一个内嵌的shell脚步
让我们开始一个简单的例子:编写一个app,打印Hello Marathon到stdout,然后sleep 5秒,周而复始。你可以使用下面的应用定义文件(json格式)来描述应用:
{
"id": "basic-0",
"cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done",
"cpus": 0.1,
"mem": 10.0,
"instances": 1
}
注意:cmd是我们要执行的命令。它的值会以/bin/sh -c ${cmd}的方式执行。
mesos执行在它自己的沙箱环境执行所有的任务。这个沙箱在每个slave节点上是一个指定的目录,其中包含很多相关的日志文件。
在应用中使用资源
通常应用逗号依赖一些资源集。例如文件和压缩文件等。为了解决资源集的问题,marathon有uris的概念。它利用mesos抓取外部资源。
我们先看一个实例:
{
"id": "basic-1",
"cmd": "./cool-script.sh",
"cpus": 0.1,
"mem": 10.0,
"instances": 1,
"uris": [
"https://example.com/app/cool-script.sh"
]
}
在执行cmd之前,先下载https://example.com/app/cool-script.sh这个资源,并且在应用的任务沙箱中让它可用。进入mesos UI,点击进入这个应用运行mesos节点的沙箱,你应该可以找到cool-script.sh这个文件。
注意mesos v0.22及以上版本,默认是不能编译下载的可执行文件的,所以cmd应该修改为:chmod u+x cool-script.sh && ./cool-script.sh
marathon也可以获取驻留在压缩包中的文件。marathon在执行cmd文件之前,执行解压压缩包的操作,支持压缩包给格式为:
.tgz
.tar.gz
.tbz2
.tar.bz2
.txz
.tar.xz
.zip
下面是压缩包的实例:
{
"id": "basic-2",
"cmd": "app/cool-script.sh",
"cpus": 0.1,
"mem": 10.0,
"instances": 1,
"uris": [
"https://example.com/app.zip"
]
}
marathon还可以下载git仓库或是cdn的资源,实例如下:
{
...
"uris": [
"https://git.example.com/repo-app.zip", "https://cdn.example.net/my-file.jpg", "https://cdn.example.net/my-other-file.css"
]
...
}
marathon还支持下载其他很多资源,支持URI的协议如下:
file:
http:
https:
ftp:
ftps:
hdfs:
s3:
s3a:
s3n:
一个简单的基于docker的应用
使用marathon我们可以运行docker镜像。
下面的实例中,我们注重看一个docker应用:一个使用python编写的web服务,它使用python:3镜像。容器内部,这个web服务运行在8080端口(这个端口号使用containerPort定义)。容器的外部,marathon分配任意个接口(hostPort设置为0)。
{
"id": "basic-3",
"cmd": "python3 -m http.server 8080",
"cpus": 0.5,
"mem": 32.0,
"container": {
"type": "DOCKER",
"docker": {
"image": "daocloud.io/library/python:3",
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 8080, "hostPort": 0 }
]
}
}
}
在这个例子里,我们将使用HTTP API部署basic-3应用。
curl -X POST http://10.141.141.10:8080/v2/apps -d @basic-3.json -H "Content-type: application/json"
我们可以在marathon ui界面查看随机分配的访问端口访问应用。