Deploy elixir/phoenix utilizando Docker no DigitalOcean
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:
- Docker — https://www.docker.com/products/docker-desktop
- Docker-machine — https://github.com/Nordstrom/docker-machine/blob/master/docs/install-machine.md
- Elixir — https://elixir-lang.org/install.html
- Phoenix — https://hexdocs.pm/phoenix/installation.html
- 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.