Running Concourse Locally on Windows

Update 3: Ok, got this all documented, cleaned up, and pushed to Github: vagrant-concourse-local.

Update 2: Bosh deployment also didn’t work on Windows. I did finally manage to get builds working. Rough recipe was: use Vagrant (from the Windows shell) to spin up an Ubuntu box. Run vault, postgres, and concourse via docker-compose (I wanted to use Vault because that’s how I am used to managing secrets, although unsealing is a pain). I need to debug having everything come up after a reboot and clean up the Vagrantfile, then I will publish something.

Update: Turns out the instructions below did NOT work. Next attempt was to try to run the concourse/lite box via Vagrant; still no dice, then saw it was deprecated anyway. Currently trying a VirtualBox lite deployment via concourse-bosh-deployment.

I just spent a fair amount of time getting Concourse running locally on my Windows PC, and figured I might as well write it all down in case someone else runs into all this. In my case, I recently learned Concourse and wanted to use it for CI/CD for some hobby projects, but didn’t want to just run it in AWS since I wouldn’t be using it that often.

For context, I have a regular Home edition of Windows 10, which means that I can’t run the nifty Docker Desktop for Windows (boo) and have to run the older Docker Toolbox that installs VirtualBox and then runs Docker inside a Linux VM.

I grabbed a docker-compose.yml file from the Concourse tutorial site, ran docker-compose up -d, and…couldn’t connect to the UI in my browser.

After much poking around, I finally figured out that you can’t use localhost ( to talk to Concourse, but have to use the local NAT IP address of the VM. You can find this by running docker-machine from the “Docker Quickstart” shell that comes with Docker Toolbox:

So in my case I can navigate to and get the Concourse UI.

The other updates I made to the docker-compose.yml were to create a named volume (docker volume create concourse-data) so I can re-mount the database if my PC reboots, and, most importantly, to populate the CONCOURSE_EXTERNAL_URL environment variable for the concourse container, so that redirect URLs will get properly generated to use the NAT address. That’s it! Here’s the working Docker Compose file (you can run it with docker-compose up -d in a Docker Quickstart shell):

Note: It can take quite a bit for the database to initialize itself the first time, and the Concourse UI won’t listen on its socket until it can talk to the database, which means if you get a “connection refused” you might just need to wait a little longer. A little docker logs -f goes a long way here!