Packaging Software with Docker
This post details how to package and deploy software with Docker. The example uses Merecat httpd on Alpine Linux. Try it out with:
docker pull troglobit/merecat
See https://hub.docker.com/r/troglobit/merecat/ for details on how to run Merecat httpd in production.
The software I’ve chosen for this exercise is Merecat httpd, and the reason is simple: we needed a really small web front-end to the FTP server at work and Debian has removed Boa from its repo, which also means it’s missing from Ubuntu these days.
If you’ve not yet installed Docker, do so now.
sudo apt install docker.io
sudo adduser $LOGNAME docker
NOTE: Remember to log out and in again to activate the new group settings before continuing below.
Merecat comes with a Dockerfile, so all we need to do to is build the image and flatten it before we deploy. Start by cloning the repo:
git clone https://github.com/troglobit/merecat.git
cd merecat/
docker build .
[..]
Successfully built c87dd09084a3
Take note of the resulting image hash, here c87dd09084a3
. You can
also find this with the docker images
command.
Now, take it for a spin. Allow your host’s port 80 (HTTP) to be forwarded to the container’s port 80:
docker run -dit -p 80:80 c87dd09084a3
d98583cb31c9417c6e4117768245f1256e3003d44668e21e75589b63e0e03074
www-browser localhost
Another hash is printed, this time for the running container, which can
also be seen using the docker ps
command.
Finally, it’s time to flatten the container:
docker export d98583cb31c9 | docker import - troglobit/merecat:latest
Notice this size difference of between d98583cb31c9 and the flattnened
image, run docker images
:
REPOSITORY TAG IMAGE ID CREATED SIZE
troglobit/merecat latest 1764df1eb990 5 seconds ago 4.271 MB
<none> <none> c87dd09084a3 29 minutes ago 192.4 MB
alpine 3.5 37c7be7a096b 3 days ago 3.991 MB
We now have our production image. Kill the currently running “template” container and remove its image before continuing:
docker kill d98583cb31c9
docker rmi -f c87dd09084a3
Let’s check the production image, here I export my FTP directory to the container’s WWW dir. Notice how the entry point is lost after flattening, so we have to provide the full command, or write a new Dockerfile:
docker run -dit -v /srv/ftp:/var/www -p 80:80 troglobit/merecat merecat -n /var/www
www-browser localhost
You should now see the FTP server contents, provided of course your host
has an /srv/ftp
directory.