Lightweight process containers

Lightweight process containers - docker

Overview

Heroku provides an extremely easy to use technology for hosting web apps based on dynos (linux containers). Amazon Web Services (AWS) provdies full virtuals servers with fir more advanced security mechanisms and even the possibility to have VPN connections. AWS also provides a wide array of hosted servises, like RDS, SES, SQS etc. etc. Elastic Beanstalk provides similar solutions to Heroku with the advantage of AWS security and isolation.

The drawback og AWS and Elastic Beanstalk is that it becomes fairly expensive when using several development languages (like PHP, Node and Python) since a EB instance only can run one language.

I’m looking for a solution where I can run several web apps in one and same ec2 virtual machine.

lxc provides containers for processes running under linux. These are much more lightweight that full VMs. lxc is for instance used by Heroku in their cloud solution. Docker is a, open source, solution built on top of lxc that is used by docCloud. docCloud makes it possible to combine different technologies (php, node, python, perl etc.) in one environment.

First test on OSX

Links:

  • https://index.docker.io

I’m simply following this:

  • http://docs.docker.io/en/latest/installation/vagrant/

First install VirtualBox and Vagrantup.

This will take a while:

git clone https://github.com/dotcloud/docker.git
cd docker
vagrant up
vagrant reload
vagrant ssh
docker
docker pull base
docker run -i -t base /bin/bash
root@8088365a71c3:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
root@8088365a71c3:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 22:28 ?        00:00:00 /bin/bash
root         9     1  0 22:28 ?        00:00:00 ps -ef
root@8088365a71c3:/# exit
exit
# Start a very useful long-running process
JOB=$(docker run -d base /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# Collect the output of the job so far
docker logs $JOB

# show containers
docker ps

docker stop ...

docker export ... > mycontainer.tar

cat mycontainer.tar | docker import - node010

docker images

# Kill the job
docker kill $JOB

More on lxc

Links:

  • https://help.ubuntu.com/12.04/serverguide/lxc.html

Docker HTTP API

Create a new container:

curl -X POST -H Content-Type=application/json -d \
'{ "Hostname":"","User":"","Memory":0,"MemorySwap":0,"AttachStdin":false,"AttachStdout":true,"AttachStderr":true,"PortSpecs":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["date"],"Dns":null,"Image":"base","Volumes":{},"VolumesFrom":""}' http://localhost:4243/containers/create

List containers:

curl -v http://localhost:4243/containers/json?all=1

Start container:

curl -X POST -H Content-Type=application/json -v http://localhost:4243/containers/[ID]/start

Attach to container:

`` echo ‘ps -ef’ | curl -X POST -v ‘http://localhost:4243/containers/[ID]/attach?logs=1&stream=1&stdout=1&stdin=1&stderr=1’




## Install sshd in container

docker run -i -t base /bin/bash

In s separate terminal

docker ps docker commit [ID] colmsjo/sshd docker images

-d will set a custom DNS server

docker run -d colmsjo/sshd /usr/sbin/sshd -D

```