Installing nova-docker with devstack
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>
[...]