Loading repository data…
Loading repository data…
lucasroges / repository
Este repositório contém uma versão baseada em contêineres da aplicação BRAMS, a fim de facilitar o desenvolvimento e realização de testes da aplicação.
Nesse tutorial, cobriremos tópicos acerca da execução do BRAMS em um ambiente de containers, incluindo a instalação do Docker, preparação do ambiente, recursos do Docker utilizados e a execução do modelo nesse ambiente, utilizando um ou múltiplos hosts.
O Docker é uma plataforma que oferece diversos recursos para organizar e executar aplicações em containers.
Container é um artíficio de virtualização, com a característica de ser um ambiente leve, devido a maneira como é virtualizado (OS-level virtualization). Estão sendo comumente utilizados, visto que oferecem diversas vantagens em relação a outros métodos de virtualização e em relação a utilização de aplicações de maneira local. Seus benefícios incluem isolamento, consistência, reprodutibilidade, compatibilidade, entre outros. O Docker facilita a utilização dos containers ao oferecer recursos para configurar, executar, distribuir e gerenciar aplicações em containers.
Alguns recursos oferecidos pelo Docker, e que serão utilizados nesse tutorial, são listados e referenciados abaixo:
Os subtópicos de preparação do ambiente devem ser realizados previamente ao início do resto do tutorial, pois alguns passos podem levar algum tempo para serem efetuados.
Nesse tópico, indicaremos links para a instalação do Docker em ambiente Linux e Windows.
Abaixo, seguem os tutoriais do Docker para instalação nas principais distribuições do Linux.
Segue o tutorial do Docker para instalação no Windows:
Para outras versões do Windows 10 ou versões mais antigas, a solução é utilizar o Docker Toolbox:
Antes de abordarmos os conceitos do Docker e executarmos o container, vamos finalizar a preparação do ambiente com o download de alguns recursos necessários.
Baixe a imagem existente do BRAMS (versão 5.3), utilizando o comando abaixo em um dos ambientes que seguem, de acordo com a plataforma:
docker pull lraraujo/brams:5.3
O conceito de imagem será abordado na sequência, por enquanto apenas precisamos que ela esteja disponível na máquina.
Em relação ao terminal utilizado para o comando anterior, será sempre o mesmo para execução de outros comandos.
O próximo passo é escolher um dos dois casos de teste executados até então:
Esse arquivo deve ser descompactado em algum local na máquina em que o Docker foi instalado. Para os testes realizados até então, os subdiretórios necessários para execução do modelo são: datain/, dataout/ e shared_datain/. O restante dos arquivos pode ser ignorado.
Finaliza-se aqui a preparação do ambiente. Antes de iniciar o tutorial, de fato, espera-se que esses passos sejam realizados para fluir normalmente os passos que seguem.
Iniciaremos abordando como o BRAMS foi portado para a execução em containers e, na sequência, trataremos os dois casos de execução: single-host e multi-host. Por fim, mostraremos algumas maneiras de utilizar o container como um ambiente de testes para modificações na aplicação e distribuição dessas versões modificadas.
Nesse tópico, será explorado como é construída uma imagem, mais especificamente a imagem do BRAMS, para entender esse conceito e como ele faz parte do processo de containerização.
No Docker, uma imagem é um recurso composto por diversas camadas que são criadas através da execução de uma sequência de comandos. Esses comandos são dispostos em um arquivo chamado de Dockerfile, que funciona como um template. Nesse arquivo, são colocados comandos que construirão a imagem com todas as aplicações e dependências necessárias para executar o que se deseja, dentro de um container. A utilização das imagens se dá justamente através dos containers, que são instâncias das imagens. O intuito da imagem é criar um ambiente isolado, com aquilo que realmente é necessário para executar a aplicação dentro de um container.
A imagem do BRAMS foi construída utilizando o Dockerfile disponibilizado no repositório. Os comandos para construção da imagem foram divididos nas subseções abaixo para uma melhor abordagem do que é realizado.
Todos os arquivos Dockerfile válidos iniciam com um comando FROM, que especifica qual a imagem base para a construção da imagem desejada.
Na parte inicial do Dockerfile, são instaladas as dependências para execução do modelo. Entre essas dependências temos MPI, o pacote WGRIB2 e as bibliotecas NetCDF. Agora, essas aplicações se encontram isoladas nesse ambiente e também podem evitar problemas de compatibilidade, devido a versão do SO da própria imagem.
Esse recurso é configurado para a execução em múltiplos hosts, sendo descartável caso o usuário vá executar somente em um único host. A configuração SSH tem dois objetivos:
ssh do host principal para todos os outros.ssh para o container no host principal para então executar o script e distribuir a aplicação entre os containers.Na sequência, realiza-se uma cópia da versão do modelo disponibilizada. Acima dessa cópia, há um comentário com os arquivos que estão sendo disponibilizados e serão utilizados. Após a cópia, o modelo é configurado, compilado e instalado.
Após os passos anteriores, há a cópia de um script e uma breve limpeza de arquivos. Por fim, é definido o diretório de trabalho, é definido que o container escutará a porta 22 durante a execução (SSH, necessário apenas para multi-host) e o comando padrão é definido como o servidor OpenSSH, que também indica que o container ficará aguardando essa conexão.
Após finalizar o Dockerfile, a imagem pode ser construída para ficar disponível localmente. Abaixo, está o comando a ser executado para construir a imagem, no diretório onde encontra-se o Dockerfile.
docker build -t <name> .
Após a construção da imagem, ela pode ser vista através do comando docker images. Informações como o tamanho da imagem e a data de criação também aparecerão com a utilização desse comando.
Nesse tópico, será explorado a execução do BRAMS em um único host, seja local ou remoto. A execução em um único host utiliza um único container.
Para executar uma imagem em um único container, utilizamos o comando docker run. Em nosso caso, ele será seguido de alguns parâmetros e o comando que será executado ao inicializar o container. Esse comando vai sobrepor o comando definido no Dockerfile (sshd, útil para o caso multi-host). Abaixo encontra-se o comando utilizado e os detalhes de cada parâmetro utilizado.
Linux ou Windows (Docker Toolbox):
No Windows, utilizar o Docker Quickstart Terminal.
docker run --rm -v /absolute/path/to/datain:/root/bin/datain -v /absolute/path/to/dataout:/root/bin/dataout -v /absolute/path/to/shared_datain:/root/bin/shared_datain --name brams lraraujo/brams:5.3 /root/run-brams -np <number of processes> -testcase <chosen testcase> -hosts localhost:<number of processes>
Windows 10 64-bit: Pro, Enterprise, or Education:
Acessar este link e seguir as instruções para compartilhar o disco local com os containers. É necessário para utilização dos volumes.
Em relação a uma das configurações solicitadas durante a instalação, havia uma escolha entre Windows containers e Linux containers. Para execução do modelo, a escolha a ser feita é Linux containers. Caso a escolha tenha sido a outra, segue o link com instruções para realizar a troca após a instalação.
Para execução do comando abaixo, utilizar o Microsoft PowerShell.
docker run --rm -v c:/path/to/datain:/root/bin/datain -v c:/path/to/datain:/root/bin/dataout -v c:/path/to/datain:/root/bin/shared_datain --name brams lraraujo/brams:5.3 /root/run-brams -np <number of processes> -testcase <chosen testcase> -hosts localhost:<number of processes>
--rm: Comando para remover o container após sua execução.
-v <host path>:<container path>: Volume para compartilhamento de dados entre host local e container.
--name <container-name>: Nome do container.
<image>: Após o nome, é selecionada a imagem.
<command>: Por fim, o comando que será executado. Nesse caso, um script preparado para executar a aplicação através de alguns parâmetros.
Dentro do container, há um script para facilitar a execução, principalmente em execução com múltiplos hosts. Para o caso com um único host é importante definir bem os parâmetros do script e, para tal, vamos abrir o script para ver como se dá seu fluxo de execução. O arquivo se encontra em run-brams.
Como abordado acima, a utilização de volumes acarreta em compartilhamento de dados entre host local e container, nos dois sentidos. Dessa forma, os dados gerados nesses diretórios compartilhados, durante a execução, serão mantidos no host local.
Nesse tópico, será explorado a execução do BRAMS em múltiplos hosts. A execução em múltiplos hosts utiliza mais de um container, dependendo da quantidade de hosts existentes. O lançamento dos containers ocorrerá de maneira automatizada, utilizando alguns recursos oferecidos pelo Docker.
Docker Swarm: Recurso que possibilita a formação de um cluster composto por diversos Docker hosts.
Docker Compose: Recurso para configurar e executar aplicações com múltiplos containers. Ao invés de um coma