An open and reliable container runtime https://github.com/containerd/containerd
Find a file
Michael Crosby f8ee26ffca Merge pull request #14 from LK4D4/add_logging
Add logging and more info
2015-12-08 11:38:13 -08:00
api/v1 Add concurrency and id flag for daemon 2015-12-07 15:19:56 -08:00
containerd Merge pull request #14 from LK4D4/add_logging 2015-12-08 11:38:13 -08:00
ctr Merge pull request #11 from LK4D4/fix_compile 2015-12-07 14:33:46 -08:00
docs Add bundle documentation 2015-12-07 14:15:12 -08:00
linux Merge pull request #14 from LK4D4/add_logging 2015-12-08 11:38:13 -08:00
runc Merge pull request #14 from LK4D4/add_logging 2015-12-08 11:38:13 -08:00
runtime Merge pull request #14 from LK4D4/add_logging 2015-12-08 11:38:13 -08:00
util Add prctl to utils package 2015-12-07 10:36:48 -08:00
.gitignore add ctr to git ignore 2015-12-07 14:49:45 -08:00
add_process.go Refactor event loop with types 2015-12-01 10:55:13 -08:00
checkpoint.go Refactor checkpoint information 2015-12-04 14:00:07 -08:00
delete.go Add checkpoint timestamp based on mtime 2015-12-04 15:12:57 -08:00
errors.go Move libcontainer to linux pkg 2015-12-01 12:00:11 -08:00
event.go Remove serialization for internal types 2015-12-07 14:47:03 -08:00
exit.go Add event subscribers. 2015-12-01 18:49:24 -05:00
get_containers.go Refactor event loop with types 2015-12-01 10:55:13 -08:00
machine.go Add concurrency and id flag for daemon 2015-12-07 15:19:56 -08:00
Makefile Make root makefile 2015-12-08 11:37:55 -08:00
README.md Add bundle documentation 2015-12-07 14:15:12 -08:00
signal.go Refactor event loop with types 2015-12-01 10:55:13 -08:00
start.go Add checkpoint timestamp based on mtime 2015-12-04 15:12:57 -08:00
stats.go Refactor event loop with types 2015-12-01 10:55:13 -08:00
supervisor.go Add debug logging about events 2015-12-08 11:32:04 -08:00
supervisor_linux.go Add linux import path 2015-12-02 10:59:43 -08:00
supervisor_runc.go Fix compilation for all tags 2015-12-07 12:39:24 -08:00
supervisor_unsupported.go Fix compilation for all tags 2015-12-07 12:39:24 -08:00
update.go Add ability to signal container not just processes 2015-12-04 14:10:50 -08:00
version.go Bump to alpha v0.0.2 2015-12-04 14:17:26 -08:00
worker.go Log start tasks 2015-12-08 11:33:43 -08:00

containerd

Another container runtime built for performance and density. containerd has advanced features such as seccomp and user namespace support as well as checkpoint and restore for cloning and live migration of containers.

Status

alpha

What does alpha, beta, etc mean?

  • alpha - not feature complete
  • beta - feature complete but needs testing
  • prod ready - read for production

Docs

For more documentation on various subjects refer to the /docs directory in this repository.

Building

To build the daemon you will need to cd into the containerd directory in the respository and type make. You will need to make sure that you have Go installed on your system and the containerd repository is cloned in your $GOPATH. You will also need to make sure that you have all the depedencies cloned as well.

Performance

Starting 1000 containers concurrently runs at 126-140 containers per second.

Overall start times:

[containerd] 2015/12/04 15:00:54   count:        1000
[containerd] 2015/12/04 14:59:54   min:          23ms
[containerd] 2015/12/04 14:59:54   max:         355ms
[containerd] 2015/12/04 14:59:54   mean:         78ms
[containerd] 2015/12/04 14:59:54   stddev:       34ms
[containerd] 2015/12/04 14:59:54   median:       73ms
[containerd] 2015/12/04 14:59:54   75%:          91ms
[containerd] 2015/12/04 14:59:54   95%:         123ms
[containerd] 2015/12/04 14:59:54   99%:         287ms
[containerd] 2015/12/04 14:59:54   99.9%:       355ms

REST API v1

Starting a container

To start a container hit the /containers/{name} endpoint with a POST request. The checkpoint field is option but allows you to start the container with the specified checkpoint name instead of a new instance of the container.

Example:

curl -XPOST localhost:8888/containers/redis -d '{
    "bundlePath": "/containers/redis",
    "checkpoint: "checkpoint-name"
    }' 

Add a process to an existing container

To add an additional process to a running container send a PUT request to the /containers/{name}/processes endpoint.

Example:

curl -s -XPUT localhost:8888/containers/redis/process -d '{
       "user" : {
          "gid" : 0,
          "uid" : 0
       },
       "args" : [
          "sh",
          "-c",
          "sleep 10"
       ],
       "env" : [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "TERM=xterm"
       ]
    }'

Signal a specific process in a container

To send a signal to any of the containers processes send a POST request to the /containers/{name}/process/{pid} endpoint.

Example

curl -s -XPOST  localhost:8888/containers/redis/process/1234 -d '{"signal": 15}'

Get the state of containerd and all of its containers

To the the entire state of the containerd instance send a GET request to the /state endpoint.

Example:

curl -s localhost:8888/state

Response:

{
   "containers" : [
      {
         "state" : {
            "status" : "running"
         },
         "bundlePath" : "/containers/redis",
         "id" : "redis",
         "processes" : [
            {
               "args" : [
                  "redis-server",
                  "--bind",
                  "0.0.0.0"
               ],
               "user" : {
                  "gid" : 1000,
                  "uid" : 1000
               },
               "terminal" : false,
               "pid" : 11497,
               "env" : [
                  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                  "TERM=xterm"
               ]
            }
         ]
      }
   ],
   "machine" : {
      "cpus" : 4,
      "memory" : 7872909312
   }
}

Create a checkpoint for a container

To create a checkpoint for a container send a POST request to the /containers/{name}/checkpoint/{checkpointname} endpoint. All of the options to this endpoint are optional.

If you send "exit": true the container will be stopped after the checkpoint is complete, the default is to keep the container running.

Example:

curl -s -XPOST localhost:8888/containers/redis/checkpoint/test1 -d '{
        "exit": false,
        "tcp": false,
        "unixSockets": false,
        "shell": false
    }'

List all checkpoints for a container

To list all checkpoints for a container send a GET request to the /containers/{name}/checkpoint endpoint.

Example:

curl -s localhost:8888/containers/redis/checkpoint

Response:

[
   {
      "name" : "test1",
      "unixSockets" : false,
      "tcp" : false,
      "shell" : false,
      "timestamp" : "2015-12-04T15:09:14.915868934-08:00"
   },
   {
      "name" : "test2",
      "tcp" : false,
      "unixSockets" : false,
      "shell" : false,
      "timestamp" : "2015-12-04T15:09:14.915868934-08:00"
   }
]

Delete a container's checkpoint

To delete a container's checkpoint send a DELETE request to the /containers/redis/checkpoint/{checkpointname} endpoint.

Example:

curl -XDELETE -s localhost:8888/containers/redis/checkpoint/test1

Update a container

The update endpoint for a container accepts a JSON object with various fields for the actions you with to perform. To update a container send a PATCH request to the /containers/{name} endpoint.

Pause and resume a container

To pause or resume a continer you want to send a PATCH request updating the container's state.

Example:

# pause a container
curl -XPATCH localhost:8888/containers/redis -d '{"status": "paused"}'

# resume the container
curl -XPATCH localhost:8888/containers/redis -d '{"status": "running"}'

Signal the main process of a container

To signal the main process of the container hit the same update endpoint with a different state.

Example:

curl -s -XPATCH localhost:8888/containers/redis -d '{"signal": 9}'