Deploy CTFd with Docker

This lab will show you how to build a multi-container application using Docker Compose. Last week we built a simple web application using Docker and a Dockerfile. Useful web applications need more than one container. CTFd is a web-based capture the flag game. In order to run CTFd requires an application server written in Python, MariaDB to store data and Redis to perform caching. The lab will show you how to how to use Docker Compose to build a multi-container system.


You should have Docker installed on your Vagrant VM.

Step 1: Install Docker Compose

Follow the Install Docker Compose instructions. If successful you should be able to run docker-compose from the command line.

$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

Step 2: Get the CTFd Source from GitHub

The source code for CTFd is on GitHub. You can clone the repository with the following command:

$ git clone

The authors of the project have different ways to test the code in a development environment. Look inside the CTFd directory and you will see a Vagrantfile a Dockerfile and a docker-compose.yml file.

Step 3: Change the Service Port

Change the contents of docker-compose.yml so that the service starts on port 80 of your Vagrant VM. This will give you access to it via your local browser. Change the ports definition to look like the snippet below:

      - "80:8000"

Step 4: Bring up the System

Use the docker-compose command to bring up the network of containers.

$ docker-compose up 

The first run of docker-compose will build the CTFd container from the Dockerfile. This will take a few moments. Once the containers are built the application will run in the foreground. Hitting Ctrl-C will stop CTFd from running. Passing the -d option will run the application in the background.

Step 5: Visit your CTF

With everything built you should be able to direct your browser to this link and see the application:

Turn In

Turn in a screenshot of CTFd running.