blob: 1e1e3066c23f2b4f8510da45d977e01c5727d01b [file] [log] [blame] [view]
---
title: Apache Mesos - Standalone Containers
layout: documentation
---
# Standalone Containers
Traditionally, launching a container in a Mesos cluster involves
communication between multiple components:
```
Container(s)
+-----------+ +--------+ +-------+ +----------+
| Framework | <-> | Master | <-> | Agent | <-> | Executor |
+-----------+ +--------+ +-------+ | `->Task |
^ +----------+
| +-------+ +----------+
+------> | Agent | <-> | Executor |
| +-------+ | `->Task |
... +----------+
```
Mesos 1.5 introduced "Standalone Containers", which provide an alternate
path for launching containers with a reduced scope and feature set:
```
+-------+ +----------------------+
Operator API <-> | Agent | -> | Standalone Container |
+-------+ +----------------------+
```
**NOTE:** Agents currently require a connection to a Mesos master in
order to accept any Operator API calls. This limitation is not necessary
and may be fixed in future.
**NOTE:** Standalone containers only apply to the Mesos containerizer.
For standalone docker containers, use docker directly.
As hinted by the diagrams, standalone containers are launched on single
Agents, rather than cluster-wide. This document describes the major
differences between normal containers and standalone containers; and
provides some examples of how to use the new Operator APIs.
## Launching a Standalone Container
Because standalone containers are launched directly on Mesos Agents,
these containers do not participate in the Mesos Master's offer cycle.
This means standalone containers can be launched regardless of resource
allocation and can potentially overcommit the Mesos Agent, but cannot
use reserved resources.
An Operator API might look like this:
```
LAUNCH_CONTAINER HTTP Request (JSON):
POST /api/v1 HTTP/1.1
Host: agenthost:5051
Content-Type: application/json
{
"type": "LAUNCH_CONTAINER",
"launch_container": {
"container_id": {
"value": "my-standalone-container-id"
},
"command": {
"value": "sleep 100"
},
"resources": [
{
"name": "cpus",
"scalar": { "value": 2.0 },
"type": "SCALAR"
},
{
"name": "mem",
"scalar": { "value": 1024.0 },
"type": "SCALAR"
},
{
"name": "disk",
"scalar": { "value": 1024.0 },
"type": "SCALAR"
}
],
"container": {
"type": "MESOS",
"mesos": {
"image": {
"type": "DOCKER",
"docker": {
"name": "alpine"
}
}
}
}
}
}
```
The Agent will return:
* 200 OK if the launch succeeds, including fetching any container images
or URIs specified in the launch command.
* 202 Accepted if the specified ContainerID is already in use by a running
container.
* 400 Bad Request if the launch fails for any reason.
**NOTE:** Nested containers share the same Operator API. To launch a nested
container, the ContainerID needs to have a parent; and no resources may be
specified in the request.
## Monitoring a Standalone Container
Standalone containers are not managed by a framework, do not use executors,
and therefore do not have status updates. They are not automatically
relaunched upon completion/failure.
After launching a standalone container, the operator should monitor the
container via the `WAIT_CONTAINER` call:
```
WAIT_CONTAINER HTTP Request (JSON):
POST /api/v1 HTTP/1.1
Host: agenthost:5051
Content-Type: application/json
Accept: application/json
{
"type": "WAIT_CONTAINER",
"wait_container": {
"container_id": {
"value": "my-standalone-container-id"
}
}
}
WAIT_CONTAINER HTTP Response (JSON):
HTTP/1.1 200 OK
Content-Type: application/json
{
"type": "WAIT_CONTAINER",
"wait_container": {
"exit_status": 0
}
}
```
This is a blocking HTTP call that only returns after the container has
exited.
If the specified ContainerID does not exist, the call returns a 404.
## Killing a Standalone Container
A standalone container can be signalled (usually to kill it) via this API:
```
KILL_CONTAINER HTTP Request (JSON):
POST /api/v1 HTTP/1.1
Host: agenthost:5051
Content-Type: application/json
{
"type": "KILL_CONTAINER",
"kill_container": {
"container_id": {
"value": "my-standalone-container-id"
}
}
}
KILL_CONTAINER HTTP Response (JSON):
HTTP/1.1 200 OK
```
If the specified ContainerID does not exist, the call returns a 404.
## Cleaning up a Standalone Container
Unlike other containers, a standalone container's sandbox is not garbage
collected by the Agent after some time (like other sandbox directories).
The Agent is unable to garbage collect these containers because there is
no status update mechanism to report the exit status of the container.
Standalone container sandboxes must be manually cleaned up by the operator and
are located in the agent's work directory under
`/containers/<my-standalone-container-id>`.