Friday, November 16, 2018

Hello World Java-Docker

Docker é um software que cria, gerencia e coordena containers. Containers por sua vez são processos que rodam dentro do Docker. Exemplos de containers são:
  • Wildfly JBoss 
  • MySQL
  • Linux Ubuntu
  • Ruby
  • Windows Nano
  • React NPM
  • JDK 6, 7, 8 etc.

Diferentemente dos processos que executam isoladamente em sistema operacional qualquer, os quais são compilados para executar somente naquele ambiente e ainda podem demandar outras instalações e configurações a parte, os containers são extremamente portáveis e rodam sobre uma imagem que representa o ambiente completo requirido para que aquele processo execute com sucesso.

Uma imagem no Docker é uma definição estática e imutável de todo um ambiente de execução.

Já o container é uma instância (em execução ou parada) de uma imagem. No Docker, containers estão para uma imagem assim como objetos estão para uma classe no Java.

Uma vez que containers não são instalados diretamente no sistema operacional local, nem suas dependências, que podem ser muitas, o maior benefíco do Docker é a portabilidade, já que um container pode executar em qualquer outro sistema operacional que tenha o Docker instalado.

O maior benefíco do uso de containers é a portabilidade

Hello World da Imagem Open JDK 10




Neste exemplo introdutório criamos uma classe chamada HelloJavaDocker que vai executar no container chamado hello-java-docker criado a partir da imagem Open JDK 10:

public class HelloJavaDocker{

    public static void main(String[] args){

        System.out.println("HELLO WORLD FROM JAVA DOCKER IMAGE!! *************\n\n");
    }
}

Compile a classe e gere o arquivo HelloJavaDocker.class:

$ javac HelloJavaDocker.java

No mesmo diretório no qual se encontra o arquivo HelloJavaDocker.class, crie um arquivo chamado Dockerfile. Este arquivo contém as instruções sobre como executar a classe HelloJavaDocker em qualquer lugar:

# imagem
FROM openjdk:10

# ADD recebe 2 parametros
# 1) fonte para adicionar na imagem; 2) localização do fonte dentro da imagem
ADD HelloJavaDocker.class .

# diz ao Docker como executar o fonte
ENTRYPOINT ["java", "HelloJavaDocker"]


Construindo a Imagem e Rodando o Container

Caso você não tenha o docker instalado na sua máquina, você pode baixá-lo, no Linux, pelo seguinte comando:
    
        $ wget -qO- https://get.docker.com/ | sh
    
Para versões a partir do Windows 10 (64bit) você pode baixar o executável na página oficial do Docker.

A maioria das operações no Docker se resumem a 2 passos:
  1. Construir a imagem, comando docker build
  2. Rodar o container, comando docker run

Para construir a imagem OpenJDK, vá para o diretório onde se encontra o arquivo Dockerfile e HelloJavaDocker.class e execute o seguinte comando:
    
        $ ls
        Dockerfile  HelloJavaDocker.class  HelloJavaDocker.java
        $ docker build -f Dockerfile -t hello-java-docker .
    

A opção -f  (file) recebe como argumnento a localização do Dockerfile.

A opção -t (tag) recebe como argumento o nome que daremos ao container e já cria uma instância baseada nessa imagem.

Agora execute a instância da imagem, que é o container hello-java-docker:
    
        $ docker run -it hello-java-docker
    


A classe HelloJavaDocker executou dentro do container hello-java-docker baseado na imagem Open JDK 10. 

Repare que nem sabemos se o Java está instalado e configurado no host local, pode ser sim, pode ser que não... Isso é indiferente! (na verdade o Java está instalado porque compilamos a classe fora da imagem, porém também poderíamos compilar o arquivo .java dentro do Docker)

Referências:
krammark23 Youtube
Docker Deep Dive, Nigel Poulton (2016)

       

No comments:

Post a Comment