Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 24, 2022 05:33 pm GMT

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

ou no Docker Desktop:
Image description

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:
Image description

No Docker Desktop:
Image description

Aps, podemos constatar que a aplicao est rodando na porta 4000:
Image description

Ento, vamos tentar acessar a aplicao:
Image description

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:
Image description

Caso voc receba a mensagem This page ins't working:
Image description

Altere o arquivo config/dev.exs trocando {127, 0, 0, 1} para {0, 0, 0, 0}
Image description

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:

Image description

Vamos adicionar no aquivo Dockerfile o comando WORKDIR:

FROM elixir:1.13.3-alpineWORKDIR /app...

Vamos verificar que agora ficou mais organizado:
Image description

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:
Image description

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

Image description

Image description

Mesmo com o erro do banco de dados, acesse a porta 8080:
Image description

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:
Image description

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:
Image description

E, como alteramos os arquivos, precisamos fazer o build novamente:

$ docker-compose up --build

Agora funciona, mas ainda temos um problema:
Image description

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:

Image description

DICA: Podemos executar tambm em background usando o comando:

$ docker-compose up -d 

Original Link: https://dev.to/maiquitome/elixir-dockerizando-aplicacoes-phoenix-19gg

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To