Ruby on Rails on Docker Composer in Ubuntu 18.04 LTS (Bionic Beaver)

Today we’ll learn how to run Ruby web applications on Rails inside Docker Containers using Docker Compose. “Ruby on rails” often known as “Rails” is a free and open source web application framework developed on Ruby Language under MIT License. Rails is a model view controller (MVC) framework which provides default structures for a database, a web service, and web pages. It utilizes JSON or XML for data storage and transfers whereas HTML, CSS, and JavaScript are for displaying output and providing user interfaces as defined. Docker is an awesome technology which is an open platform for building, shipping and running distributed applications anywhere, anytime and most importantly, from any platform ranging from small home computers to high-end servers.

Docker Compose is docker’s native tool for defining and running multi-container applications defined in a single file with Docker. Moreover is a great tool for development environments, staging servers, and CI. Here are some easy steps on how we can run ruby on rail web applications on Docker containers using Docker Compose.

1. Installing Docker Engine

First of all, we’ll need to install docker engine in our host operating system. As we are running Ubuntu 18.04 LTS in our host machine, we’ll first update our local repository index of an apt package manager.

$ sudo apt-get update

After updating the local repository index, we’ll need to run the following command to install docker engine.

$ sudo wget -qO- https://get.docker.com/ | sh

Now, we’ll need to add our user to the group docker so that we can access docker without sudo or root permission. To do so, we’ll need to run the following.

$ sudo usermod -aG docker arun

Note: Here, *arun is the username of the account we are currently logged in and wanna add to the group docker. So, we extremely recommend replacing arun with your own username.

2. Installing Docker Compose

After we have successfully installed docker engine, we’ll now need to install docker compose that we’ll be featuring in this tutorial. As docker compose is not available in the official repository of Ubuntu, so we’ll gonna install it from the official GitHub page.

$ wget https://github.com/docker/compose/releases/download/1.4.2/docker-compose-Linux-x86_64
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
 $ sudo chmod +x /usr/local/bin/docker-compose

3. Configuring Dockerfile

Next, after the docker engine is installed in our machine, we’ll gonna create the most common file for docker ie Dockerfile. We can create the file using a text editor inside our working directory. To do so, we’ll need to run the following command.

$ nano Dockerfile

Now, we’ll gonna configure our Dockerfile configurations.

FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp

4. Defining Compose Configuration

Finally, we’ll now create our main compose file where the real thing happens. Here, we’ll create a docker-compose.yml file in which we’ll define the configurations for our web app and database required by it to store data. In this file, we define the configurations that are necessary to link both the web app and the database and expose their ports. To do so, we’ll create the file using our favorite text editor.

$ nano docker-compose.yml

Then, we’ll gonna copy and paste the following lines of configuration into the file.

db:
image: postgres
ports:
– “5432”
web:
build: .
command: bundle exec rails s -p 80 -b ‘0.0.0.0’
volumes:
– .:/myapp
ports:
– “80:80”
links:
– db

5. Generating Rails Skeleton App

Before we for generating the rails skeleton, we’ll need to create a file named Gemfile. We can create it using a text editor.

$ nano Gemfile

Then, we’ll need to append the file with the following lines of configurations.

source ‘https://rubygems.org’
gem ‘rails’, ‘4.2.2’

Now, we’ll gonna build an image for web service using Dockerfile and then we’ll generate a new rails skeleton app inside the container built from the newly created image. To do so, we’ll simply need to run the following command.

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle

Now, we’ll uncomment the line in our newly generated Gemfile which loads therubyracer. To do so, we’ll gonna open Gemfile using our favorite text editor.

$ nano Gemfile

Then, we’ll gonna find the following line and uncomment it as shown below.

gem ‘therubyracer’, platforms: :ruby

Now that we’ve got a new Gemfile, we need to build the image again.

$ docker-compose build

6. Configuring Database

Now we’ll edit our newly generated database.yml using a simple text editor.

$ nano database.yml

Next, we’ll need to make changes to the file database.yml to look as the lines of a configuration shown below.

development: &default
adapter: postgresql
encoding: unicode
database: postgres
pool: 5
username: postgres
password:
host:

db

test:
<<: *default
database: myapp_test

7. Running Rails Container

Finally, after our hard work, we’ll now gonna run our rails container using docker compose. To run the application container. We’ll need to run the following command.

$ docker-compose up

At last, we’ll gonna create the database by running the following command in a new terminal.

$ docker-compose run web rake db:create

Now, we are done. We can now access our Ruby app by browsing our web browser to our server on port 80 by default as our docker web container is exposed on port 80 ie http://ip-address or http://domain.com


Conclusion

Hurray!! ? ? Docker Compose is very easy to configure and makes our job pretty fast if we need run multiple Docker containers instantly. In this tutorial, we learned how we can run multiple containers in order to run our ruby on rails application using docker compose. Similarly, we can use docker compose to run WordPress, lamp stack and other various applications and servers in our Linux based servers.

Read More: “WordPress with Docker and Docker Compose in Ubuntu 18.04 LTS”

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.