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:
- The user has the Eucalyptus Cloud Administrator credentials. Please refer to the Eucalyptus 3.4 documentation for getting information about obtaining the cloud administrator’s credentials.
- An Ubuntu Cloud Raring Eucalyptus Machine Image (EMI) that has an associated Eucalyptus Ramdisk Image (ERI) and Eucalyptus Kernel Image (EKI). For more information about these steps, please refer to the “Bundle, Upload and Register an Image” section in the Eucalyptus Image Management Guide.
- SSH access in the security group where the instances will be launched. For more information, please refer to “Authorize Security Groups” section in the Eucalyptus 3.4 User Guide.
- A key pair for the cloud administrator thats been used with euca-run-instances to launch the Ubuntu Cloud Raring EMI. For additional information, refer to the “Create Key Pairs” section of the Eucalyptus 3.4 User Guide.
- VM type m1.medium where RAM is at least 1024 MB and Disk is 10 GB. For more information about VM types, refer to the Eucalyptus 3.4 User Guide and euca-modify-instance-type in the Euca2ools Guide.
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!