Construindo aplicações em Rails com Docker

Alexandre Dias
Jaguaribe Tech
Published in
7 min readAug 25, 2017

Primeiramente, você sabe o que é o Docker? De acordo com a própria empresa, Docker é a principal plataforma de container de software. Talvez fique mais fácil de entender esse conceito com a explicação do que é um container, que é uma maneira de fazer um pacote de software rodar de forma isolada independente do ambiente que você utiliza e que possui tudo o que você precisa para fazer sua aplicação rodar, diferente de máquinas virtuais eles não constroem um novo material, mas bibliotecas e as configurações necessárias para fazer o software rodar.

Muitos desenvolvedores utilizam Docker para evitar aquele velho problema de aplicação e ferramentas de diversos projetos ocupando espaço em sua máquina e também para melhorar a colaboração do mesmo com outros desenvolvedores. Com Docker, basicamente você vai ter um ambiente seguro onde será compartilhado colaborativamente as atividades entre os envolvidos onde você vai construir algo que seja independente de um sistema operacional. Quando um projeto é dockerizado o programador não tem que se preocupar com diversas complexidades, entre elas não precisar perder tempo instalando e seguindo passo-a-passo ou se preocupando com dependências.

E quais as vantagens de utilizar o Docker?

- Qualquer aplicação, linguagem e framework: construir, testar, implementar containers nos servidores Windows, Linux e Mac escritos em qualquer linguagem de programação sem risco de incompatibilidade e conflitos de versão. Existe uma facilidade em encapsular sua aplicação, fazendo com que você consiga mover o mesmo facilmente entre ambientes, funcionando corretamente em qualquer máquina que estiver usando o Docker.

- Melhor experiência para desenvolver: Docker trabalha como uma abstração. Você irá reduzir o tempo de instalação em 65%, pois rapidamente você irá criar, testar e rodar complexos aplicativos multi-containers e assim economizar todo o tempo que iria ser gasto com a instalação. Aqueles tutoriais gigantes de 30 páginas sobre como instalar o ambiente para o desenvolvedor que acabou de entrar na equipe serão extintos, os comandos que o Docker traz fazem com que o trabalho fique de uma forma automatizada, repetitiva, eficiente e rápida.

Mas como o Rails se encaixa no meio disso tudo?

E se eu falar que:

1) Existe uma maneira na qual você pode desenvolver sua aplicação em Rails isoladamente no seu ambiente de trabalho sem usar, por exemplo, RVM ou chruby, além de mudar as versões do Ruby de forma super prática.

2) Se por um acaso, você como um freelancer com diversos projetos Rails, terá acesso a tudo que você precisa isolado para cada projeto sem precisar desperdiçar o seu amado SSD.

3) Você pode rodar o Rails, PostgreSQL, Redis e muito mais em cerca de três segundos!

4) Você pode compartilhar seu projeto no GitHub para outros desenvolvedores e tudo que eles terão que fazer para ter tudo rodando em minutos é executar um único comando.

Com isso, já vimos como o Docker pode ser aplicável e produtivo para o desenvolvedor Web que esteja construindo sua aplicação em Rails. Agora iremos colocar isso em prática! Nesse tutorial você irá aprender a rodar sua aplicação Rails com Docker.

1 — Instalando o Docker

Seguindo os tutoriais feitos pelo próprio Docker apropriado para o seu sistema operacional você instalará o mesmo e será necessário que complete ao menos o exemplo de “hello world” feito no guia de instalação. Escolha o SO da sua máquina e acesse os passos de instalação.

Linux: https://docs.docker.com/linux/started/

Mac: http://docs.docker.com/mac/started/

Windows: http://docs.docker.com/windows/started/

Certifique também que possui o Docker Compose instalado após instalar o Docker, dependendo do seu sistema operacional ele já vem instalado com a instalação do Docker. Digite na linha de comando docker-compose -v e caso não esteja instalado, digite a seguinte linha no terminal (para Mac):

brew install docker-compose

2 — Definindo o Projeto

Comece configurando os quatro arquivos que você precisará para construir a aplicação. Primeiro, já que sua aplicação irá rodar dentro de um container Docker com todas as dependências já dentro, você tem que definir exatamente o que será incluído dentro desse container. Isso é feito usando um arquivo chamado Dockerfile, ele consiste em:

FROM ruby:2.3.3RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejsRUN mkdir /myappWORKDIR /myappADD Gemfile /myapp/GemfileADD Gemfile.lock /myapp/Gemfile.lockRUN bundle installADD . /myapp

Isso colocará o código de sua aplicação dentro de uma imagem que irá construir um container com Ruby, Bundler e todas as dependências necessárias. Todos os passos da construção da escrita do Dockerfiles pode ser encontrado dentro do guia de usuário do Docker. Para construir essa imagem docker apropriadamente digite no terminal:

docker build .

Em seguida, crie um Gemfile de bootstrap que apenas carrega Rails. Ele será substituído em breve pelo rails new.

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

Você irá precisar de um Gemfile.lock vazio para poder construir o Dockerfile.

touch Gemfile.lock

E agora é hora do esperado: docker-compose.yml (ou .yaml) que é onde a mágica acontece. Este arquivo descreve:

a) os serviços que compõem sua aplicação (o banco de dados e a aplicação web);

b) como pegar cada imagem Docker (o banco de dados apenas roda uma imagem pré-criada do PostgreSQL e a aplicação web é criada a partir do diretório atual);

c) a configuração necessária para conectar os dois e disponibilizar a porta da aplicação web.

version: ‘3’
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b ‘0.0.0.0’
volumes:
— .:/myapp
ports:
— “3000:3000”
depends_on:
— db

3 — Construa o projeto

Com esses quatro arquivos você poderá gerar o esqueleto de seu projeto Rails usando o docker-compose run:

docker-compose run web rails new . — force — database=postgresql

Primeiramente, o compose irá construir a imagem para o servidor web usando o Dockerfile. Logo depois, ele irá executar o rails new dentro de um novo container, usando a imagem criada anteriormente. Quando você terminar, terá gerado uma nova aplicação.

Liste os arquivos com ls -l . Se você estiver usando o Linux, o arquivo rails new criado já está lá por default, isso acontece porque o container roda como o usuário root. Se isso for o caso, mude a propriedade dos novos arquivos.

sudo chown -R $USER:$USER .

Se estiver usando o iOS ou Windows, você já deve ter a nova propriedade de arquivos, e pode continuar com o tutorial sem colocar o código acima. Agora com um novo Gemfile, você irá construir a imagem Docker mais uma vez. Mas não se preocupe, pois essas mudanças no Gemfile ou Dockerfile são feitas apenas uma vez, você não precisará reconstruir novamente.

docker-compose build

4 — Conexão com banco de dados

Estamos quase finalizando nosso projeto! Como você já deve estar acostumado, o Rails espera que um banco de dados esteja rodando no localhost por padrão, então você precisar fazer com que ele aponte para o banco de dados do container. Também é necessário alterar o banco de dados e o nome de usuário e senha para alinhar o mesmo com os padrões já definidos pela imagem postgres.

Substitua o conteúdo de config/database.yml com o código abaixo:

default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test

Agora iniciaremos a aplicação com o docker-compose up:

docker-compose up

Se tudo ocorrer bem, você verá alguma saída do PostgreSQL e então, depois de alguns segundos o código abaixo:

Starting rails_db_1 …Starting rails_db_1 … doneRecreating rails_web_1 …Recreating rails_web_1 … doneAttaching to rails_db_1, rails_web_1db_1 | LOG: database system was shut down at 2017–08–17 13:33:48 UTCdb_1 | LOG: MultiXact member wraparound protections are now enableddb_1 | LOG: database system is ready to accept connectionsdb_1 | LOG: autovacuum launcher startedweb_1 | => Booting Pumaweb_1 | => Rails 5.0.0.1 application starting in development on http://0.0.0.0:3000web_1 | => Run `rails server -h` for more startup optionsweb_1 | Puma starting in single mode…web_1 | * Version 3.9.1 (ruby 2.3.3-p222), codename: Private Callerweb_1 | * Min threads: 5, max threads: 5web_1 | * Environment: developmentweb_1 | * Listening on tcp://0.0.0.0:3000web_1 | Use Ctrl-C to stop

E finalmente, você cria o banco de dados. Em outra aba no terminal, digite:

docker-compose run web rake db:create

5 — Hora de Rails!

Pronto! Veja a página do Rails de “Bem Vindo” na porta 3000! http://localhost:3000

Lembrando que isso apenas é um exemplo de uma aplicação rails rodando dentro do Docker, cada aplicação possui uma série de dependências diferentes e distintas que são definidas dentro do Dockerfile, o que vai variar de acordo com cada tecnologia usada. Podemos concluir que alternar o desenvolvimento de sua aplicação rails para o Docker pode até de início ser um pouco trabalhoso, mas seus benefícios fazem valer a pena. Você acaba tendo um ambiente que é fácil de compartilhar com a equipe de desenvolvimento, você pode modelar o mesmo para fazer com que ele se assemelhe com seu ambiente e entendê-lo. Fácil, rápido, eficiente e com pouco espaço para erros. Além de que você não polui seu computador com todas aquelas bibliotecas que você vai precisar usar em um único projeto.

Referências:

https://docs.docker.com/compose/rails/#build-the-project

https://blog.engineyard.com/2016/building-rails-applications-in-docker

https://robots.thoughtbot.com/rails-on-docker

https://github.com/IcaliaLabs/guides/wiki/Creating-a-new-Rails-application-project-with-Docker

https://blog.codeship.com/running-rails-development-environment-docker/

https://semaphoreci.com/community/tutorials/dockerizing-a-ruby-on-rails-application

--

--