In my last post, I walked through how to run Ghost in a container on a really cheap VM with Digital Ocean. It's a great start, but while I have reproducibility in the container, I can't be sure that I supplied the correct parameters when I run the container. That is,
docker run -e url=<host> -p <dest:src> -v <dest:src> --restart=always ghost:3.33.0-alpine. What if I need to restart? Can I be sure I did it exactly the same each time? Sure, I could create a simple bash script to start the container, but there's a better solution.
Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application's services. In essence, you use a single YAML file that describes multiple services and start and stop these services with a single command. Furthermore, we have the config file available in case we need to make any tweaks later on.
So let's get into it.
Install Docker Compose
Installing Docker Compose is super simple. Just run:
$ apt install docker-compose
This will go ahead and grab Docker Compose along with any dependencies. It won't be the latest version, but I don't care much about that.
Configure Docker Compose
Configuring the container is simple (in as much as any YAML config file is simple). Hey, I don't mind them, but I know a lot of people who seem to think YAML destroyed the internet.
Create the file
/var/www/anthonyison.com/docker-compose.yaml with the following contents:
version: "3.1" services: ghost: container_name: ghost image: ghost:3-alpine restart: always ports: - 2368:2368 environment: - NODE_ENV=production - url=https://anthonyison.com volumes: - ./content:/var/lib/ghost/content
The content folder should be immediately off this folder. The
content folder will be mapped to the
/var/lib/ghost/content folder when the container is started. The config file also sets up the url, ports, image, container name, etc.
If we wanted to step things up, we could also start a MySQL container and set the config for Ghost to use MySQL instead of SQLite as the database. I don't care to do that for now.
We can now start the Ghost container like so:
$ cd /var/www/anthonyison.com $ docker-compose up -d
To shut down all of the containers started by Docker Compose, we could then run:
$ docker-compose down
We now have a configuration file for the parameters required to run our Ghost container for the blog. This reduces the complexity (or at least makes it more reproducible) since the container can be started with a simple
docker-compose up command.
As we've discovered in this post, Docker Compose helps to simplify the startup and basic orchestration of containers. Kubernetes would take this to a whole new level, but I can't fit a Kubernetes cluster into my limited budget just yet. For now, Docker Compose will fit the bill while keeping my running costs right down.