If I had my hand full of truth, I would take good care how I opened it

Building Puppet-Based Applications Inside Docker

Creating a Docker Dockerfile to build an
application is pretty easy. But what if you already have a large
collection of Puppet modules (or Chef cookbooks) that you want to use to
build your applications? We’re going to see how easy it is to make use
of those modules inside a
Dockerfile.1

We’re first going to build a image that has Docker apps with
Puppet installed. We’ll also add Tim
Sharpe’s very cool Librarian-Puppet to
the image. Librarian-Puppet is a bundler for your Puppet modules. You
can use it to select and install modules from GitHub or the Puppet Labs
Forge.

This Dockerfile uses the jamtur01/puppetbase image we’ve just
created. It adds our local Puppetfile file to the root of the image
and then runs librarian-puppet install to install our required
modules (by default into /modules).

We then install Nginx via the puppet-nginx module using the puppet
apply command. This runs Puppet locally on the host (i.e. without a
client-server Puppet installation).

In this image we’re just installing Nginx itself. We could also install
virtual hosts or a web application or anything else that the Nginx
module supports.

We can now build our application image like so:

$ sudo docker build -t="jamtur01/nginx" .

Finally let’s launch a container from it.

$ sudo docker run -P -d jamtur01/nginx
fd461a1418c6

We’ve launched a new container with the ID of fd461a1418c6, run it
daemonized and told it to open any exposed ports, in our case port
80 that we EXPOSE‘ed in the Dockerfile. Let’s
check the container and see what port it has mapped to Nginx.

$ sudo docker port fd461a1418c6 800.0.0.0:49158

Now let’s browse to port 49158 to see if Nginx is running.

{:.center}

Woot! We’ve got Nginx installed via Puppet. You could easily repeat this
process for any Puppet-based (or other CM tool) application or
infrastructure.3

This is a somewhat short-term hacky implementation. When Docker is more pluggable this will be a lot easier. Expect to see that sort of plugin support in the 1.0 release.
[return]