This is an example of how I use Docker and Docker Compose to develop my rails apps.
It is an ideal project setup for new and experienced developers alike, and allows to a nearly trouble-free environment setup in their development machines.
In this example we'll fire up a full app environment consisting of the following:
- A postgres container which hosts the app's database.
- A redis container which hosts the app's job queue.
- An example Rails app running 3 processes on separate containers:
- A
jobs
container running the app's job processor (Sidekiq). - A
worker
container running the Rails web server. - A
test
container running guard, which fires tests automatically whenever a change in the app code is detected.
- A
You'll need to follow some instructions to get this example running:
You must have Docker and Docker Compose on your machine.
You can install these with:
- Docker for Mac on macOS
- Docker for Windows on Windows
You should clone the project into a conveniently-named directory, as this repo's name is big enough to make typing docker/compose commands tiresome, should the need arise:
git clone https://github.com/vovimayhem/docker-compose-rails-dev-example.git example \
&& cd example \
&& docker-compose up -d web jobs \
&& docker-compose logs -f
Watch it as it starts all the containers, and how the app database is initialized upon the first run before starting the rails web server.
Originally there was some setup to be made prior to running the app. Fortunately a lot of changes happened since then, and although the dotenv file is recommended, it is not required for the project to run immediately after cloning.
If you need to, however, you can copy the contents of the example dotenv file into a file
called .env
:
cp example.env .env
Docker Compose now reads the /.env
file by default, if it exists. You can still add other dotenv
files and reference them in the docker-compose.yml
file, but that would require an additional step
than the coveted 'clone and run' project setup.
docker-compose up -d
That's it! Check the running app web interface: http://localhost:3000
I usually do some tricks to aid in my day to day activities:
Pretty self-explanatory.
The docker-compose
commands are a bit lengthy for my taste, so I started generating some bash
aliases... eventually I created a small Go app called Plis
which besides having a smalled character count, it allows me to attach to any container using the
service name, which is a must to debug the app using byebug
:
plis start web && plis attach web
# => Converts the commands to `docker-compose up -d web && docker attach example_web_1`
Create a new rails app using docker, if you find yourself in the need of creating a new app, and you are already running this example project.
It uses MRI ruby 2.2.6. I'll make some branches using different engines (i.e. Rubinius, JRuby)
- Everything Docker
- GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS (Seriously, thoughtbot?)
- Introducing 'heroku docker:release': Build & Deploy Heroku Apps with Docker geez! These guys are on EVERYTHING!
I'd love to receive feedback & suggestions from everyone. If you see something off, or think there's a better way to do something this thing does, please do:
- Fork the original repository.
- Make your changes in a topic branch.
- Send a pull request.
This is free software, and may be redistributed under the terms specified in the LICENSE file.