A seguir, o foco será minha experiência na execução do aplicativo Spring Boot dockerizado nas máquinas virtuais gratuitas do serviço em nuvem
Heroku . Uma das principais vantagens desse provedor é que possibilita a criação de máquinas virtuais gratuitas com restrição de horário de funcionamento e, para isso, apenas o registro é suficiente. Mesmo os detalhes do pagamento não precisam ser confirmados, embora se você os confirmar, poderá receber bônus adicionais. Você pode ler mais sobre o preço deles
aqui . Do meu ponto de vista, a política deles em relação aos recursos livres quase não tem análogos.
E assim, depois de criar um aplicativo no Heroku, há
várias maneiras de implantar seu código nele
- confirmar no repositório heroku git
- vincular aplicativo ao repositório do github
- usando o docker container
A seguir, consideraremos o último desses métodos. Para continuar, precisaremos dos seguintes aplicativos
A última dessas ferramentas nos dará a oportunidade de executar todas as operações de trabalho com a nuvem na linha de comando.
Começamos criando um aplicativo Spring Boot por meio do
Spring Initializr . Como dependências, adicione o Spring Web Starter. Deve ser o suficiente.
No mesmo pacote em que a classe principal do aplicativo está localizada, adicionamos a classe mais simples do controlador REST para que o aplicativo mostre sinais de vida.
@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } }
Adicionar ao arquivo
application.properties server.port=${PORT:8080}
Essa configuração é crítica para executar o contêiner no Heroku. O fato é que, na rede interna do serviço, o aplicativo é iniciado em alguma porta livre no momento do lançamento, cujo número é transmitido pela variável de ambiente PORT. Além disso, o aplicativo deve ter tempo para se conectar a essa porta nos primeiros
60 segundos após o lançamento, caso contrário, ele será interrompido.
Na seção de
plug -
ins do arquivo
pom.xml, adicione o
dockerfile-plugin do Spotify, que nos ajudará na montagem da imagem do docker do nosso aplicativo.
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
Essa configuração de plug-in começará a criar a imagem como parte do destino de instalação e enviará a imagem para o repositório do docker Heroku como parte do destino de implantação. A propósito, para poder executar a implantação maven, é necessário desativar a implantação do arquivo jar coletado (não precisamos carregá-lo em nenhum lugar). Você pode fazer isso usando a opção
maven.deploy.skip na seção de propriedades do arquivo pom.xml.
<properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties>
Em seguida, crie um
Dockerfile na pasta raiz do projeto (ao lado de pom.xml)
FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"]
Como você pode ver, passamos o nome do arquivo jar montado aqui como argumento para a montagem (ARG JAR_FILE). O valor desse argumento é definido nas configurações do plugin maven.
O script
entrypoint.sh também será colocado na raiz do projeto e será muito simples.
Preste atenção aos parâmetros da JVM que limitam a memória e, especialmente, aos dois primeiros parâmetros. Eles incluem um modo especial de gerenciamento de memória, necessário quando um aplicativo java é iniciado dentro do contêiner do Docker. A memória disponível para o aplicativo em máquinas Heroku gratuitas é limitada a 512 MB. Exceder esse limite encerrará o aplicativo. Se você deseja usar o Java 9+, as duas primeiras opções precisam ser substituídas por uma
-XX: + UseContainerSupport . Você pode ler mais
aqui . Parece também que o suporte ao contêiner deixou de ser um recurso experimental no Java 8.
Detalhes aqui.Após concluir estas etapas, tente iniciar
mvnw clean install
Se tudo for feito corretamente, o aplicativo e a imagem da janela de encaixe devem ser compilados. Você pode verificar se a imagem foi criada usando o comando
docker images
Agora vamos configurar a nuvem e usar a já mencionada CLI Heroku para isso. Obviamente, para concluir essas etapas, você precisará registrar uma conta no Heroku.
Primeiro de tudo, precisamos fazer login. Para fazer isso, execute o comando
heroku login
e siga as instruções abaixo.
Depois disso, você precisa fazer login no repositório heroku Docker. Para fazer isso, execute o comando
heroku container:login
sem isso, não podemos enviar nossa imagem do docker.
Em seguida, criamos o aplicativo usando o comando
heroku apps:create <app-name>
Observe que o nome do aplicativo deve corresponder ao nome do artefato especificado em
pom.xml . Talvez aqui você deva gastar algum tempo selecionando o nome do aplicativo, que ainda não é ocupado por ninguém.
Depois que o aplicativo é criado, execute
mvnw clean deploy
e aguarde a criação do aplicativo e pressione a imagem do docker. Observe que o envio só é possível se o nome da imagem corresponder ao modelo
registry.heroku.com/<app-name>/web e um aplicativo com o nome <app-name> foi criado. Se você olhar as configurações do plugin maven, verá que tudo é feito exatamente dessa maneira.
A etapa final para a imagem a ser implantada e lançada é o comando
heroku container:release web --app=<app-name>
Depois disso, siga o link
https: // <app-name> .herokuapp.com / check e depois de um tempo você verá o texto que será exibido pelo manipulador do controlador.
Outra maneira de abrir um aplicativo em execução em um navegador é usar o comando
heroku open --app=<app-name>
Se algo não funcionar, os logs podem ser visualizados na interface da Web Heroku ou com o comando
heroku logs
Isso é tudo! Espero que este guia tenha sido útil!
Alguns links úteis
1.
Documentação da Heroku CLI
devcenter.heroku.com/categories/command-line2. Sobre os recursos de gerenciamento de memória no Java
devcenter.heroku.com/articles/java-memory-issues3.
devcenter.heroku.com/categories/deploying-with-docker4. Um exemplo de aplicativo Java da Heroku. Há um método de implantação diferente, mas é útil consultar
github.com/heroku/java-getting-started5. Guia do Heroku para iniciar um aplicativo Java (não via Docker)
devcenter.heroku.com/articles/getting-started-with-java?singlepage=true6. Bom material sobre o uso de Java no Docker
habr.com/en/company/hh/blog/4509547. Sobre as opções para iniciar o Java nos contêineres do Docker
www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115