Deploy elixir/phoenix utilizando Docker no DigitalOcean

Orlando Ohashi
3 min readMay 19, 2020

--

O objetivo deste post não é explicar conceitos básicos de elixir, phoenix ou docker é descrever o passo-a-passo de um deploy de uma aplicação phoenix utilizando Docker (docker-machine) no Digital Ocean (facilmente adaptável para outros hosts).

Softwares utilizados:

  1. Criar uma aplicação phoenix mais simples possível.

No terminal criar uma aplicação phoenix denominada de “teste”, sem ecto.

$ mix phx.new teste --no-ecto

2. Testar a aplicação criada.

$ cd teste$ mix phx.server

O servidor é iniciado no endereço http://localhost:4000. Onde é possível verificar a página padrão do phoenix.

3. Definindo variável de ambiente SECRET_KEY_BASE

É necessário definir o SECRET_KEY_BASE para rodar o phoenix no container

$ mix phx.gen.secretD2G34jVQ0/KaNolNbfz...

Exportar a variável na shell:

$ export SECRET_KEY_BASE="D2G34jVQ0/KaNolNbfz..."

4. Criar o container

Dentro da pasta do projeto “teste” criar um arquivo “Dockerfile” com o seguinte conteúdo:

# imagem baseFROM bitwalker/alpine-elixir-phoenix:latestWORKDIR '/app'# porta exportadaEXPOSE 5000# definir variáveis de ambienteENV PORT=5000 MIX_ENV=prod SECRET_KEY_BASE=${SECRET_KEY_BASE}# cache elixir depsCOPY mix.exs mix.lock ./RUN mix do deps.get, deps.compile# cache npm depsCOPY assets/package.json assets/RUN cd assets && npm install# copiar o projeto pro containerCOPY . .# run frontend build, compile, and digest assetsRUN cd assets/ && npm run deploy && cd - && mix do compile, phx.digestUSER defaultCMD ["mix", "phx.server"]

Comando pra criar o container local, com a tag “local_teste”

$ docker build -t local_teste .

Este processo demora alguns minutos, o docker vai baixar as imagens e produzir o build local do container, alguns warnings podem aparecer.

$ docker images

Vai listar todas as imagens disponíveis, inclusive a imagem que acabamos de criar, “local_teste”

5. Testando a imagem localmente

Inicia o container criado no passo 4. O parâmetro -it permite o direcionamento da shell do container para a shell do PC. O parâmetro -p faz o mapeamento da porta do PC com a porta do container. A porta 5000 foi exportada no arquivo Dockerfile.

$ docker run -it -p 4000:5000 local_teste

Abra o browser e acessar o endereço: http://localhost:4000/

6. Conta no Digital Ocean

É necessário para o próximo passo ter uma conta no digital ocean. E gerar uma token da API

7. Definindo variável de ambiente DO_TOKEN

$ export DO_TOKEN="API TOKEN"

8. Criando um droplet utilizando docker-machine

O comando “docker-machine create” vai criar e configurar todo o ambiente necessário para trabalhar com containers no droplet padrão no digital ocean, com 1G de RAM e custo mensal de $5.

docker-machine create --driver digitalocean --digitalocean-access-token $DO_TOKEN box

9. Listando as máquinas configuradas

É possível criar tanto máquinas (VM) remotas quanto locais (virtualbox), basta escolher o “driver” apropriado.

$ docker-machine ls

Como podemos perceber na máquina foi criada no digital ocean e o estado é “running”

NAME      ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER     ERRORSbox       -        digitalocean   Running   tcp://68.183.53.205:2376           v19.03.9

Enquanto a máquina estiver rodando você será cobrado pelo digital ocean, pelo tempo de processamento.

10. Comandos básicos do docker-machine

  • Ip da máquina
$ docker-machine ip box
  • Stop máquina
$ docker-machine stop box
  • Start máquina
$ docker-machine start box
  • SSH máquina
$ docker-machine ssh box

11. Fazer o build no box (digital ocean)

É preciso configurar as variáveis de ambiente da máquina remota.

$ eval $(docker-machine env box)

A partir de agora as requisições serão executadas na máquina remota no digital ocean.

$ docker images

Como a máquina box acabou de ser criada o comando acima não vai retornar nenhuma imagem.

$ docker build -t remote_teste .

12. Rodando imagem no digital ocean

Descobrindo o ip da máquina remota

$ docker-machine ip box68.183.53.204

Rodando o container na porta 80 do servidor remoto (box)

$ docker run -it -p 80:5000 remote_teste

Basta acessar no navegador o ip 68.183.53.204.

--

--