Creating a Data Only Docker container

First let me apologise for this very text heavy post.

In my quest to get on top of this “Docker Thing” I have been using BSDPy in a Docker container and have found it fantastically easy to use and deal with, especially at scale. I can bring a Linux server up and have it acting as a NetBoot server in just a few minutes. If you haven’t checked out BSDPy yet then have a look at it here

The one thing that was slightly annoying to me though was that I had to share a folder from my linux host to to the BSDPy Docker container, this was the /nbi folder which contained my NBI’s

For example i would normally run:

docker run -d -p 0.0.0.0:69:69/udp -p 0.0.0.0:67:67/udp -p 0.0.0.0:80:80 -e DOCKER_BSDPY_IP=172.16.16.16 -v /storage/nbi:/nbi:rw --name bsdpy macadmins/bsdpy

The section there “ -v /storage/nbi:/nbi:rw ” what that is doing is, its taking the folder that exists on the linux host at /storage/nbi and mounting that into our bsdpy container at /nbi

So in order to get NBI’s into the bsdpy container for it to serve to our clients, we have to upload them somehow to /storage/nbi on our linux host – this could be done via scp, rsync or something like that. A little bit painful.

I thought why don’t I put my NBI’s into a data only container, then I can have the BSDPy Docker container access the data only container instead. This makes deploying my NBI’s a lot easier as well, instead of having to scp them or rsync or some other method to get them onto the file system, I can instead just have docker pull down the container that houses the NBI at the same time as it pulls down the BSDPy container

Now instead of telling docker to map /storage/nbi from the host to the docker container, we tell docker to use the exposed volume on the data only container and mount that into /nbi instead with a command like this

docker run -d -p 0.0.0.0:69:69/udp -p 0.0.0.0:67:67/udp -p 0.0.0.0:80:80 -e DOCKER_BSDPY_IP=172.16.16.16 --volumes-from nbi-data-only --name bsdpy macadmins/bsdpy

So how do we go about creating this Data Only docker container and how do we get our NBi’s into it?
Well its actually really simple.
First start on a linux host that has docker installed, log in as root and create a directory which will be your working directory i like to use somewhere like ~/nbi-data-only

Move into this directory and create a Dockerfile

touch Dockerfile

A Dockerfile is kind of like a script that Docker uses to generate an image.
The first thing we want to put in this docker file is some info about our container, we can simply comment this out so Docker ignores it but if we look at it later we know whats going on.

# Docker Data-Only Container to hold
# NetBoot NBI images, for use with BSDPy Docker containers
# This allows for easy portability and maintenance
# Version 0.1
# Author Calum Hunter
# Data 11/11/14

Now we add our first command

FROM busybox

This will tell docker to use an existing image (busybox) as a base

We also add

MAINTAINER Calum Hunter (calum.hunter@xxxxx.xxxx.xxx) This is just to let docker know who create the image

Now we can put some RUN commands in the docker file so that the build process runs these commands at build time

RUN mkdir /nbi

RUN chmod -R 755 /nbi

These commands create the directory we need in the new image.

Now we need to get our NBI we want to add into our data container into our working directory. We need to have our .nbi folder in the same directory as our Docker file. So do whatever you would normally do in order to get your NBI into this directory whether it be SCP, rsync, fileshare whatever.

Now in our Dockerfile we want to run another command that is going to copy our NBI into our data only container

ADD Auto_NBI_14A389.nbi /nbi/Auto_NBI_14A389.nbi

RUN chmod -R 755 /nbi

So now we have copied the nbi into our data container, we need to tell the container what volume we want to expose and make available to other containers. We do this by using the VOLUME command

VOLUME /nbi

Last is the CMD command which tells docker what command to run when the container is started, this can just be a basic shell command such as

CMD ["/bin/sh"]

So now we should have a completed Dockerfile that looks like this

# Docker Data-Only Container to hold
# NetBoot NBI images, for use with BSDPy Docker containers
# This allows for easy portability and maintenance
# Version 0.1
# Author Calum Hunter
# Data 11/11/14
FROM busybox

MAINTAINER Calum Hunter (calum.hunter@xxxx.xxxx.xxx)

RUN mkdir /nbi

RUN chmod -R 755 /nbi

ADD Auto_NBI_14A389.nbi /nbi/Auto_NBI_14A389.nbi

RUN chmod -R 755 /nbi

VOLUME /nbi

CMD ["/bin/sh"]

Now its time to build it!

First think about where you’re going to store this nbi, I’ll assume that you’re just going to upload it to the docker hub. The reason for this is that when you push your image up to a repository such as the docker hub it will use this naming convention to work out where to save it.

So my build command looks like this

build -t hunty1/nbi-data-only . 

So essentially its username/name-of-container

This will build the container locally on your machine, once its completed you should be able to see the new image listed when you run docker images

If you wanted to upload this image to the docker hub you would simply run

docker push hunty1/nbi-data-only 

Change that username/container-name of course to match your needs
So now all we would have to do on a brand new host is install docker and then run

docker run -d -p 0.0.0.0:69:69/udp -p 0.0.0.0:67:67/udp -p 0.0.0.0:80:80 -e DOCKER_BSDPY_IP=172.16.16.16 --volumes-from hunty1/nbi-data-only --name bsdpy macadmins/bsdpy

Now that is pretty cool.

Next on the list – setting up your own private registry to store your docker images….

Leave a comment