Keeping Shipping your blog with Docker volumes

I've been running my blog on a Raspberry Pi for over a year now and for most of that time it's been running inside a Docker container. The Ghost team have released updates a bunch of times, but I wasn't always keen to risk losing my data.

Here's how I used Docker volumes to make sure the posts and images stayed permanent, even when I upgraded my container image.

Docker volumes can be defined in your Dockerfile and let the Docker engine know which parts of the filesystem can be hot swapped.

Define volumes

Here's a snippet of the directories a Ghost blog needs - this includes the SQLite database for posts, images you've uploaded and any configuration setup through the admin page. There may be more directories you need depending on your use-case.

VOLUME ["/var/www/ghost/content/apps"]
VOLUME ["/var/www/ghost/content/data"]
VOLUME ["/var/www/ghost/content/images"]

When using docker-compose to launch the blog these volumes are created externally and maintained separately from the container. That's means that moving from version 0.10.8 to 0.10.10 is as quick as removing the old container and running a new one.

Inspecting volumes

To look at all your volumes type in docker volume ls and then you can inspect individual ones with docker volume inspect allow you to drill down into the volume and see or edit the files.

DRIVER              VOLUME NAME
local               358ffce1e8aaa516da30f0f1cdba524f55b3
local               5a9ec98a259e58985a34e8685f5308f66ffd
local               blog_ghost_apps
local               blog_ghost_data
local               blog_ghost_images
local               blog_ghost_themes

All of these volumes are using a local driver which means I'm responsible for backing up the data and managing it. Various projects such as Flocker have provided their own volume plug-ins allowing NFS, Amazon S3 or other cloud storage systems to back the filesystem.

$ docker volume inspect blog_ghost_images
[
    {
        "Name": "blog_ghost_images",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/blog_ghost_images/_data",
        "Labels": null
    }
]

From here you can create a tarball of the /var/lib/docker/volumes/blog_ghost_images/_data image and back it up to your usual locations such as Rsync.net.

My setup

I'll provide my default setup and then you can edit and tune it as you need. Whether you are running on a Raspberry Pi or cloud instance - you just need to edit the base image of the Dockerfile

version: "2.0"
services:
  blog:
    ports:
      - "2368:2368"
    build: "./blog.alexellis.io/"
    volumes:
      - ghost_apps:/var/www/ghost/content/apps
      - ghost_data:/var/www/ghost/content/data
      - ghost_images:/var/www/ghost/content/images
      - ghost_themes:/var/www/ghost/content/themes
    restart: always

volumes:
   ghost_apps:
      driver: local
   ghost_data:
      driver: local
   ghost_images:
      driver: local
   ghost_themes:
      driver: local

The full example with docker-compose is available here: https://github.com/alexellis/ghost-on-docker/tree/master/blog

What next?

Pick out a Docker image or Dockerfile from my previous tutorial and try migrating to a newer version of the blog. After all - you don't know if your backup strategy works until you actually use it.

See also:

Alex Ellis

Read more posts by this author.

Subscribe to Alex Ellis' Blog

Subscribe to keep in touch. By providing your email, you agree to receive marketing emails from OpenFaaS Ltd

or subscribe via RSS with your favourite RSS reader

Learn Go with my new eBook

eBook cover

"Everyday Go" is the fast way to learn tools, techniques and patterns from real tools used in production based upon my experience of building and running OpenFaaS at scale.

Buy a copy on Gumroad