An Interest In:
Web News this Week
- April 23, 2024
- April 22, 2024
- April 21, 2024
- April 20, 2024
- April 19, 2024
- April 18, 2024
- April 17, 2024
Elixir: Dockerizando Aplicaes Phoenix
Neste post vamos aprender a colocar nossas aplicaes Phoenix
em contineres e a gerenciar vrios deles utilizando Docker Compose
.
Para comear, vamos criar uma aplicao sem banco de dados para entender bem como funciona, e depois sim, vamos criar uma aplicao com banco de dados e usando docker-compose
.
- Criando o Projeto sem Ecto
- Criando a Imagem Docker sem Ecto
- Criando o Projeto com Ecto
- Criando a Imagem Docker com Ecto
- Criando o arquivo docker-compose
- Criando o arquivo SH
- Configurando o banco de dados no docker-compose
Criando o Projeto sem Ecto (sem Banco de Dados)
- Verses usadas neste projeto:
- elixir 1.13.3-otp-24
- erlang 24.1.5
Crie uma aplicao Phoenix com o comando:
$ mix phx.new dockerizando_sem_ecto --app blog --no-ecto
link do projeto no github: https://github.com/maiquitome/dockerizando_sem_ecto
Criando a Imagem Docker sem Ecto
Vamos configurar o continer da nossa aplicao Phoenix, criando um arquivo com o nome Dockerfile na raiz do projeto com o seguinte contedo:
# imagem base# Alpine uma imagem mnima do Docker baseada no Alpine Linux com um ndice de pacotes completo e apenas 5 MB de tamanho!FROM elixir:1.13.3-alpine# instalando o gerenciar de pacotes do elixirRUN mix local.hex --force && \ mix local.rebar --force# tambm funciona essa sintaxe:# RUN mix do local.hex --force, local.rebar --force# copiar tudo da raiz do projeto para o continer dockerCOPY . .# instalar as dependenciasRUN mix do deps.get, deps.compile# executar o servidorCMD ["mix", "phx.server"]
.dockerignore
Agora podemos criar um arquivo tambm na raiz do projeto chamado .dockerignore
para colocarmos os arquivos que devem ser ignorados pelo Docker, ou seja, no vo ir para dentro do continer.
Vamos colocar alguns arquivos que podemos querer ignorar, mesmo que alguns deles no estejam no nosso projeto, vamos colocar para exemplo, pois algum dia voc pode querer colocar um arquivo semelhante:
_build/deps/.elixir_ls/.git.github.gitignore.editorconfig.circlecihelm/*terragrunt.hclREADME.mddocker-compose*
Construindo a Imagem
$ docker build -t app/blog .
Executando o comando docker images
no terminal, podemos constatar que a nossa imagem foi criada:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZEapp/blog latest eae5a6582cdd 3 minutes ago 105MB
Criando um Continer
$ docker run app/blog
Executando o comando docker container ls
ou o comando antigo docker ps
no terminal, podemos constatar que o nosso continer foi criado:
Aps, podemos constatar que a aplicao est rodando na porta 4000:
Ento, vamos tentar acessar a aplicao:
E recebemos a mensagem que este site no pode ser acessado. Isso acontece, pois, a nossa aplicao est na porta 4000 dentro do continer. Para acessar precisamos executar o comando abaixo passando uma porta, neste caso a porta 8000:
$ docker run -p 8000:4000 app/blog
E agora conseguimos acessar a nossa aplicao dentro do continer:
Caso voc receba a mensagem This page ins't working
:
Altere o arquivo config/dev.exs
trocando {127, 0, 0, 1}
para {0, 0, 0, 0}
Adicionando um diretrio de trabalho (WORKDIR)
Se executarmos o comando docker run -it app/blog sh
e depois um ls
podemos notar que os arquivos do continer esto misturados com os arquivos da aplicao:
Vamos adicionar no aquivo Dockerfile
o comando WORKDIR
:
FROM elixir:1.13.3-alpineWORKDIR /app...
Vamos verificar que agora ficou mais organizado:
Criando o Projeto com Ecto (com Banco de Dados)
Agora vamos criar uma aplicao Phoenix com banco de dados:
$ mix phx.new dockerizando_com_ecto --app blog
Link do projeto no github: https://github.com/maiquitome/dockerizando_com_ecto
Criando a Imagem Docker com Ecto
Vamos usar o mesmo Dockerfile
do projeto anterior, criar a nossa imagem e subir um continer da nossa aplicao:
Aps isso, recebemos um erro, informando que a conexo com o banco de dados falhou. Para resolvermos isso vamos aprender a usar o docker-compose
.
Criando o Arquivo docker-compose
O Docker Compose serve para iniciar vrios conteiners.
Crie um arquivo na raiz do projeto chamado docker-compose.yml
.
version: "3" # verso do docker-composeservices: # servios que precisamos colocar em conteiner # e um desses servios a nossa aplicao. app: # nome da nossa aplicao, pode ser qualquer nome, nesse caso vamos dar o nome de app build: context: . # context o diretrio onde a gente est ports: # pra executar o docker run precisamos passar a porta - "8080:4000" # o `-` no yml significa que um array
Este cdigo do arquivo docker-compose.yml
ir executar o Dockerfile e, para isso, vamos executar no terminal o comando docker-compose up
:
$ docker-compose up
Mesmo com o erro do banco de dados, acesse a porta 8080:
No momento, o docker-compose
est servindo apenas para fazer o build da imagem do nosso projeto.
Criando o arquivo SH
Remova o comando CMD ["mix", "phx.server"]
do arquivo Dockerfile
.
Crie um arquivo na raiz do projeto chamado docker_dev_start.sh
.
mix ecto.drop # destri o banco de dadosmix ecto.setup # cria o banco de dados e executa o arquivo seedsexec mix phx.server # sobe o servidor
Agora vamos fazer executar este script dentro do docker-compose.yml
. Como estamos em uma mquina Alpine, adicione o seguinte comando command: /bin/sh docker_dev_start.sh
. Se a mquina fosse um Windows, por exemplo, o comando seria diferente.
version: "3" # verso do docker-composeservices: # servios que precisamos colocar em conteiner # e um desses servios a nossa aplicao. app: # nome da nossa aplicao, pode ser qualquer nome, nesse caso vamos dar o nome de app build: context: . # context o diretrio onde a gente est command: /bin/sh docker_dev_start.sh # executa o script do arquivo docker_dev_start.sh ports: # pra executar o docker run precisamos passar a porta - "8080:4000" # o `-` no yml significa que um array
Ao executarmos docker-compose up
recebemos um erro:
Para funcionar, precisamos construir novamente a imagem e, para isso, pode usar o comando:
$ docker-compose up --build
Configurando o banco de dados no docker-compose
Mas ainda temos o erro de conexo com o banco de dados, por isso, precisamos incluir o continer do postgres e configurar ele:
version: "3"services: app: build: context: . command: /bin/sh docker_dev_start.sh ports: - "8080:4000" # adicione a configurao abaixo db: image: postgres environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres ports: - "5432:5432"
Altere de localhost
para db
no arquivo config/dev.exs
:
E, como alteramos os arquivos, precisamos fazer o build novamente:
$ docker-compose up --build
Agora funciona, mas ainda temos um problema:
Precisamos fazer com o db execute totalmente primeiro e, pra isso, vamos colocar uns comandos:
version: "3"services: app: build: context: . command: /bin/sh docker_dev_start.sh ports: - "8080:4000" # adicione o depends_on e o links depends_on: - db # nosso app depende do db para funcionar links: - db db: image: postgres environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres ports: - "5432:5432"
E, como alteramos os arquivos, precisamos fazer o build novamente:
$ docker-compose up --build
E, agora sim, o db executou primeiro:
DICA: Podemos executar tambm em background usando o comando:
$ docker-compose up -d
Original Link: https://dev.to/maiquitome/elixir-dockerizando-aplicacoes-phoenix-19gg
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To