This article covers how one could create new Jekyll projects and/or run them using Docker.


In order to follow along, you need to have the following installed in your system:

Try to run the following commands:

$ docker run hello-world
$ make --version

If they ran successfully, then you can continue to the next steps.

Create a new Jekyll project

$ mkdir ~/jekyll-site
$ cd jekyll-site
$ docker run -v $(pwd):/srv/jekyll \
    jekyll/jekyll:3.8.6 \
    jekyll new . 

A fresh Jekyll installation is now on the ~/jekyll-site directory.

Run a Jekyll project

Given an existing Jekyll project at ~/jekyll-site:

$ cd ~/jekyll-site
$ docker run -v $(pwd):/srv/jekyll \
    -p 4000:4000 \
    -it \
    jekyll/jekyll:3.8.6 \
    jekyll serve

The project is now served on your host at Note that the -v $(pwd):/srv/jekyll volume flag attaches your current directory to the container’s – this effectively enables the jekyll serve hot refresh feature.

Use a Dockerfile and make

Again, given an existing Jekyll project at ~/jekyll-site, we can create a Dockerfile:

# ~/jekyll-site/Dockerfile
FROM jekyll/jekyll:3.8.6


COPY . ./


CMD ["jekyll", "serve"]

..and a Makefile:

	docker build -t yourname/your-jekyll-project .

	docker run -v ${PWD}:/app -v ${PWD}/vendor/bundle:/usr/local/bundle -p 4000:4000 -it --rm --name your_jekyll_project yourname/your-jekyll-project

The Makefile should be self-describing. An important detail to understand is the new volume that we attach to the container’s /usr/local/bundle directory. This is the location where Jekyll’s dependencies are installed, and mapping this volume to our filesystem will require the dependencies to be installed only once every time we spin up the container.

You can now commit these two files with your version control system and run your project in any Docker enabled machine with the following commands:

$ make build
$ make serve

In which again, the project is served at

Got any feedback or suggestions? Feel free to send me an email or a tweet.