This is a long-form response to this question, and describes how to get the nova-docker driver up running with devstack under Ubuntu 14.04 (Trusty). I wrote a similar post for Fedora 21, although that one was using the RDO Juno packages, while this one is using devstack and the upstream sources.
Getting started
We’ll be using the Ubuntu 14.04 cloud image (because my test environment runs on OpenStack).
First, let’s install a few prerequisites:
$ sudo apt-get update
$ sudo apt-get -y install git git-review python-pip python-dev
And generally make sure things are up-to-date:
$ sudo apt-get -y upgrade
Installing Docker
We need to install Docker if we’re going to use nova-docker
.
Ubuntu 14.04 includes a fairly dated version of Docker, so I followed the instructions on the Docker website for installing the current version of Docker on Ubuntu; this ultimately got me:
$ sudo apt-get -y install lxc-docker
$ sudo docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client): a8a31ef
OS/Arch (client): linux/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.1
Git commit (server): a8a31ef
Docker by default creates its socket (/var/run/docker.socket
) with
root:root
ownership. We’re going to be running devstack as the
ubuntu
user, so let’s change that by editing /etc/default/docker
and setting:
DOCKER_OPTS='-G ubuntu'
And restart docker
:
$ sudo restart docker
And verify that we can access Docker as the ubuntu
user:
$ docker version
Client version: 1.5.0
Client API version: 1.17
[...]
Installing nova-docker
As the ubuntu
user, let’s get the nova-docker
source code:
$ git clone http://github.com/stackforge/nova-docker.git
$ cd nova-docker
As of this writing (HEAD
is “984900a Give some time for docker.stop
to work”), you need to apply a patch to nova-docker
to get it to
work with the current Nova master
branch:
$ git fetch https://review.openstack.org/stackforge/nova-docker \
refs/changes/50/154750/3 \
&& git checkout FETCH_HEAD
Once that change has merged (update, 2015-02-12: the
patch has merged), this step should no longer be
necessary. With the patch we applied, we can install the
nova-docker
driver:
$ sudo pip install .
Configuring devstack
Now we’re ready to get devstack up and running. Start by cloning the repository:
$ git clone https://git.openstack.org/openstack-dev/devstack
$ cd devstack
Then create a local.conf
file with the following content:
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=super-secret-admin-token
VIRT_DRIVER=novadocker.virt.docker.DockerDriver
DEST=$HOME/stack
SERVICE_DIR=$DEST/status
DATA_DIR=$DEST/data
LOGFILE=$DEST/logs/stack.sh.log
LOGDIR=$DEST/logs
# The default fixed range (10.0.0.0/24) conflicted with an address
# range I was using locally.
FIXED_RANGE=10.254.1.0/24
NETWORK_GATEWAY=10.254.1.1
# This enables Neutron, because that's how I roll.
disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
# I am disabling horizon (because I rarely use the web ui)
# and tempest in order to make the installer complete a
# little faster.
disable_service horizon
disable_service tempest
# Introduce glance to docker images
[[post-config|$GLANCE_API_CONF]]
[DEFAULT]
container_formats=ami,ari,aki,bare,ovf,ova,docker
# Configure nova to use the nova-docker driver
[[post-config|$NOVA_CONF]]
[DEFAULT]
compute_driver=novadocker.virt.docker.DockerDriver
This will result in things getting installed in subdirectories of
$HOME/stack
. We enable Neutron and leave pretty much everything
else set to default values.
Start the installation
So, now we’re all ready to roll!
$ ./stack.sh
[Call Trace]
./stack.sh:151:source
/home/ubuntu/devstack/stackrc:665:die
[ERROR] /home/ubuntu/devstack/stackrc:665 Could not determine host ip address. See local.conf for suggestions on setting HOST_IP.
/home/ubuntu/devstack/functions-common: line 322: /home/ubuntu/stack/logs/error.log: No such file or directory
…or not. This error happens if devstack is unable to turn your
hostname into an IP address. We can set HOST_IP
in our
environment:
$ HOST_IP=10.0.0.232 ./stack.sh
And then go grab a cup of coffee or something.
Install nova-docker rootwrap filters
Once stack.sh
is finished running, we need to install a rootwrap
configuration file for nova-docker
:
$ sudo cp nova-docker/etc/nova/rootwrap.d/docker.filters \
/etc/nova/rootwrap.d/
Starting a Docker container
Now that our environment is up and running, we should be able to start a container. We’ll start by grabbing some admin credentials for our OpenStack environment:
$ . openrc admin
Next, we need an appropriate image; my larsks/thttpd image is small (so it’s quick to download) and does not require any interactive terminal (so it’s appropriate for nova-docker), so let’s start with that:
$ docker pull larsks/thttpd
$ docker save larsks/thttpd |
glance image-create --name larsks/thttpd \
--is-public true --container-format docker \
--disk-format raw
And now we’ll boot it up. I like to do this as a non-admin user:
$ . openrc demo
$ nova boot --image larsks/thttpd --flavor m1.small test0
After a bit, we should see:
$ nova list
+----...+-------+--------+...+-------------+--------------------+
| ID ...| Name | Status |...| Power State | Networks |
+----...+-------+--------+...+-------------+--------------------+
| 0c3...| test0 | ACTIVE |...| Running | private=10.254.1.4 |
+----...+-------+--------+...+-------------+--------------------+
Let’s create a floating ip address:
$ nova floating-ip-create
+------------+-----------+----------+--------+
| Ip | Server Id | Fixed Ip | Pool |
+------------+-----------+----------+--------+
| 172.24.4.3 | - | - | public |
+------------+-----------+----------+--------+
And assign it to our container:
$ nova floating-ip-associate test0 172.24.4.3
And now access our service:
$ curl http://172.24.4.3
<!DOCTYPE html>
<html>
<head>
<title>Your web server is working</title>
[...]