

Docker has been in the news lately as one of the hot open-source project promoting linux containers. Some use cases for Docker include the following:
- Automation of packaging and application deployment
- Lightweight PaaS environments
- Automated testing and continuous integration/deployment
- Deploying and scaling web applications, databases and backend services
The focus of this blog entry is to show how to deploy Docker on Eucalyptus from a cloud administrator’s point-of-view – all in the cloud. This is a step-by-step guide to create an Docker EMI from an existing Ubuntu Cloud Raring EMI using AWS’s documentation. This entry will also show how to build euca2ools from source in the Ubuntu Cloud image.
Prerequisites
This entry assumes the following:
After confirming that the prerequisites are met, let’s get started.
Creating an EMI From an Existing EMI
As mentioned earlier, these steps will be based off of AWS’s documentation on creating an instance store-backed AMI from an existing AMI. In this example, here is an existing Ubuntu Raring instance thats running on Eucalyptus:
$ euca-describe-instances --region eucalyptus-admin@
RESERVATION r-3E423E33 961915002812 default
INSTANCE i-827E3E88 emi-06663A57 euca-10-104-7-12.eucalyptus.euca-hasp.eucalyptus-systems.com
euca-172-17-118-27.eucalyptus.internal running euca-admin 0 m1.medium
2013-11-18T22:41:35.694Z LayinDaSmackDown eki-28F338EB eri-51253C0A
monitoring-disabled 10.104.7.12 172.17.118.27 instance-store
This instance is using the following EMI, EKI and ERI:
$ euca-describe-images emi-06663A57 eki-28F338EB eri-51253C0A --region eucalyptus-admin@
IMAGE eki-28F338EB latest-raring-kernel/raring-server-cloudimg-amd64-vmlinuz-generic.manifest.xml
441445882805 available public x86_64 kernel instance-store
IMAGE emi-06663A57 latest-raring/raring-server-cloudimg-amd64.img.manifest.xml 441445882805
available public x86_64 machine eki-28F338EB eri-51253C0A instance-store paravirtualized
IMAGE eri-51253C0A latest-raring-kernel/raring-server-cloudimg-amd64-loader.manifest.xml 441445882805
available public x86_64 ramdisk instance-store
To start, copy the zip file cloud administrator credentials obtained by the euca_conf command mentioned in the Eucalyptus 3.4 documentation to the running instance:
# scp -i euca-admin.priv admin.zip
ubuntu@euca-10-104-7-12.eucalyptus.euca-hasp.eucalyptus-systems.com:/tmp/.
Next, install the following packages for the 3.8.0-33 kernel, and packages needed to build euca2ools:
ubuntu@euca-172-17-118-27:~$ sudo apt-get install python-setuptools git python-lxml unzip linux-headers-3.8.0-33-generic linux-image-extra-3.8.0-33-generic
Find the ephemeral storage using the instance metadata service, format, and mount the ephemeral to /mnt/image:
ubuntu@euca-172-17-118-27:~$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral
sda2
ubuntu@euca-172-17-118-27:~$ sudo mkdir /mnt/image
ubuntu@euca-172-17-118-27:~$ sudo mkfs.ext4 /dev/vda2
ubuntu@euca-172-17-118-27:~$ sudo mount /dev/vda2 /mnt/image
Download euca2ools from Github:
ubuntu@euca-172-17-118-27:~$ git clone https://github.com/eucalyptus/euca2ools.git
Install euca2ools:
ubuntu@euca-172-17-118-27:~$ cd euca2ools; sudo python setup.py install
Unzip the cloud administrator credentials in /tmp:
ubuntu@euca-172-17-118-27:~$ cd /tmp; unzip admin.zip
Change to the root user, and source the cloud administrator credentials:
ubuntu@euca-172-17-118-27:~$ sudo -s; source /tmp/eucarc
Bundle, upload and register the ramdisk and kernel under /boot:
root@euca-172-17-118-27:~# euca-bundle-image -i /boot/initrd.img-3.8.0-33-generic
--ramdisk true -r x86_64
root@euca-172-17-118-27:~# euca-upload-bundle -b ubuntu-raring-docker-ramdisk
-m /var/tmp/bundle-SQrAuT/initrd.img-3.8.0-33-generic.manifest.xml
root@euca-172-17-118-27:~# euca-register -n ubuntu-raring-docker-ramdisk
ubuntu-raring-docker-ramdisk/initrd.img-3.8.0-33-generic.manifest.xml
IMAGE eri-6BF033EE
root@euca-172-17-118-27:~# euca-bundle-image -i /boot/vmlinuz-3.8.0-33-generic
--kernel true -r x86_64
root@euca-172-17-118-27:~# euca-upload-bundle -b ubuntu-raring-docker-kernel
-m /var/tmp/bundle-31Lnxy/vmlinuz-3.8.0-33-generic.manifest.xml
root@euca-172-17-118-27:~# euca-register -n ubuntu-raring-docker-kernel
ubuntu-raring-docker-kernel/vmlinuz-3.8.0-33-generic.manifest.xml
IMAGE eki-17093995
Use euca-bundle-vol to bundle the root filesystem. Make sure to exclude /tmp, /mnt/image, and /home/ubuntu. Additionally, make sure and set the size of the image to be 5 GB:
root@euca-172-17-118-27:~# euca-bundle-vol -p ubuntu-raring-docker
-s 5120 -e /tmp,/root,/mnt/image,/home/ubuntu -d /mnt/image
--kernel eki-17093995 --ramdisk eri-6BF033EE -r x86_64
Next, upload and register the root filesystem:
root@euca-172-17-118-27:~# euca-upload-bundle -b ubuntu-raring-docker-rootfs
-m /mnt/image/ubuntu-raring-docker.manifest.xml
root@euca-172-17-118-27:~# euca-register -n ubuntu-raring-docker-rootfs
ubuntu-raring-docker-rootfs/ubuntu-raring-docker.manifest.xml
IMAGE emi-26403979
We have the new EMI, EKI and ERI for the Docker instance. Lastly, set the image permissions so that all users on the cloud can use the EMI, EKI and ERI:
root@euca-172-17-118-27:~# euca-modify-image-attribute -l -a all emi-26403979
root@euca-172-17-118-27:~# euca-modify-image-attribute -l -a all eki-17093995
root@euca-172-17-118-27:~# euca-modify-image-attribute -l -a all eri-6BF033EE
Now its time to launch the Docker EMI.
Running the Docker Instance with Cloud-Init
Before launching the EMI, the cloud-init configuration file needs to be created. This file will be responsible for configuring the instance repositories, downloading and installing Docker. With your favorite command-line editor, create a file called cloud-init-docker.config, with the following content:
#cloud-config
apt_update: true
apt_upgrade: true
disable_root: true
packages:
- less
cloud_config_modules:
- ssh
- [ apt-update-upgrade, always ]
- updates-check
- runcmd
runcmd:
- [ sh, -xc, "INST_HOSTNAME=`/bin/hostname`; META_IP=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`; echo ${META_IP} ${INST_HOSTNAME} >> /etc/hosts" ]
- [ locale-gen, en_US.UTF-8 ]
- [ sh, -xc, "wget -qO docker-io.gpg https://get.docker.io/gpg" ]
- [ apt-key, add, docker-io.gpg ]
- [ sh, -xc, "echo 'deb http://get.docker.io/ubuntu docker main' > /etc/apt/sources.list.d/docker.list" ]
- [ apt-get, update ]
- [ apt-get, install, -y, --force-yes, lxc-docker ]
- [ modprobe, -q, aufs ]
Now, use euca-run-instances to launch the instance:
root@euca-172-17-118-27:~# euca-run-instances -k euca-admin emi-351237D1
-t m1.medium --user-data-file cloud-init-docker.config
After launching the instance, leave the current instance to get back to end client.
root@euca-172-17-118-27:~# exit
exit
ubuntu@euca-172-17-118-27:~$ exit
logout
Connection to 10.104.7.12 closed.
Once the instance reaches running state, ssh into the instance using the keypair specified (which in this case will be euca-admin.priv), and execute the following Docker command to run an interactive shell session inside a minimal Ubuntu container:
$ euca-describe-instances --region eucalyptus-admin@
RESERVATION r-A1613D7F 961915002812 default
INSTANCE i-AFDB3D4C emi-26403979 euca-10-104-7-13.eucalyptus.euca-hasp.eucalyptus-systems.com
euca-172-17-118-16.eucalyptus.internal running euca-admin 0 m1.medium
2013-11-19T01:21:10.880Z LayinDaSmackDown eki-17093995 eri-6BF033EE monitoring-disabled
10.104.7.13 172.17.118.16 instance-store
# ssh -i euca-admin.priv ubuntu@euca-10-104-7-13.eucalyptus.euca-hasp.eucalyptus-systems.com
Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-33-generic x86_64)
* Documentation: https://help.ubuntu.com/
System information as of Thu Nov 14 23:18:38 UTC 2013
System load: 0.0 Users logged in: 0
Usage of /: 21.6% of 4.89GB IP address for eth0: 172.17.184.76
Memory usage: 4% IP address for lxcbr0: 10.0.3.1
Swap usage: 0% IP address for docker0: 10.1.42.1
Processes: 83
Graph this data and manage this system at https://landscape.canonical.com/
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
Use Juju to deploy your cloud instances and workloads:
https://juju.ubuntu.com/#cloud-raring
New release '13.10' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Thu Nov 14 23:08:09 2013 from 10.104.10.6
ubuntu@euca-172-17-184-76:~$ sudo docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu' (tag: latest) locally
Pulling repository ubuntu
8dbd9e392a96: Download complete
b750fe79269d: Download complete
27cf78414709: Download complete
root@041d5ddcd6b9:/# (Ctrl-p Ctrl-q to exit out of shell)
ubuntu@euca-172-17-184-76:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
041d5ddcd6b9 ubuntu:12.04 /bin/bash 27 seconds ago Up 26 seconds pink_frog
Thats it! For more information regarding Docker, please refer to the latest Docker documentation.
Enjoy!
34.430176
-119.861645