A partir do momento que entender o que é Docker, verá que é muito mais simples do que parece e, como dev, sua vida se tornará muito melhor, especialmente na montagem de ambientes complexos ou na necessidade distribuição de imagens.
O que é Docker?
Docker é uma ferramenta poderosa e muito utilizada hoje em dia para criar e implantar softwares. Criada em 2013, assumiu a liderança e mudou nossa forma de trabalhar com virtualizações desde então. Segundo o auto-denominado Hacker e fundador do Docker, Solomon Hykes, Docker é um conjunto de produtos que usam virtualização de nível de sistema operacional para entregar software em pacotes chamados contêineres. Os contêineres são isolados uns dos outros e agrupam seus próprios softwares, bibliotecas e arquivos de configuração. Eles podem se comunicar uns com os outros por meio de canais bem definidos. Todos os contêineres são executados por um único kernel do sistema operacional e, portanto, usam menos recursos do que as máquinas virtuais. É importante destacar que um software ou ambiente usando o Docker sempre será inicializado da mesma forma em todos os sistemas. Isso significa que se o aplicativo funcionar em seu computador local, ele funcionará em qualquer lugar que tenha uma engine Docker rodando. Ou seja, acabando com aquela famosa máxima: "no meu computador funciona". 😀
Docker Hub
O Docker possui uma biblioteca (repositório) online com milhares de imagens de contêineres de fornecedores de software, projetos de código aberto e da comunidade, disponível no site hub.docker.com. Isso é um grande facilitador, pois não precisamos criar ambientes do zero. Por exemplo, se for preciso criar um ambiente com um servidor Apache Tomcat para rodar uma aplicação, basta executar a imagem disponível no repositório. O Tomcat e todas suas dependências já estarão disponíveis na imagem. É muito provável que encontre imagens oficiais da maior parte das soluções que precise, como: mysql, nginx, mongo, mariadb, ubuntu, node, Tomcat, etc. Também podemos enviar nossas próprias imagens ao repositório docker hub, permitindo que outras pessoas possam rodá-las ou mesmo para que nós possamos reutilizá-las. Além disso, é possível executar processos automáticos para a criação e envio das imagens ao seu repositório, conforme detalhamos neste post. Esta é uma forma eficiente de manter seu repositório atualizado.
Para localizar imagens poderá usar o docker hub ou fazer uma busca usando o comando search (documentação).
docker search [--filter is-official=true] <image> docker search tomcat docker search dockerfilemavenapi
Docker Image
Uma imagem de contêiner Docker é um pacote de software leve, autônomo e executável que inclui tudo o que é necessário para executar um aplicativo: código, ferramentas do sistema, bibliotecas e configurações. As imagens de contêiner se tornam contêineres no tempo de execução. A maioria das imagens do Docker inclui sistemas operacionais completos para permitir que você faça o que for necessário com eles, exatamente como faremos em nosso exemplo. É importante mencionar que as imagens do Docker são imutáveis. Essa incapacidade de mudar é uma característica poderosa, pois sabemos que a imagem sempre funcionará ao ser executada num contêiner. Além disso, podemos criar novas imagens a partir de imagens já criadas.
Baixar uma imagem para nosso computador é muito simples, basta usar o comando pull. A nomenclatura da imagem é formada pelo nome do repositório e uma tag <repositorio:tag>
. Logo, se queremos baixar a imagem do Tomcat, versão 9 alpine, bastaria usar o comando pull abaixo (linha 1).
$ docker pull <imagem> $ docker pull tomcat:9.0.20-jre8-alpine $ docker pull smartiblogbr/dockerfilemavenplugin:1.0
O comando image permite realizar operações relacionadas às imagens. Existem diversos comandos úteis, para isso poderá verificar a documentação. Os utilizados com mais frequência por desenvolvedores, seriam:
docker image pull # baixar imagem docker image ls # listar imagens locais docker image prune # remover imagens não utilizadas docker image rm # remover imagem específica docker image inspect # exibe informações detalhadas da imagem
Docker Container
Um contêiner é uma unidade padrão de software que empacota o código e todas as suas dependências para que o aplicativo seja executado de forma rápida e confiável de um ambiente de computação para outro. Um contêiner é uma “instância” da imagem docker. Cada contêiner é executado separadamente e você pode modificar o contêiner enquanto ele está em execução. As modificações em um contêiner do Docker não são salvas na imagem, a menos que você crie uma nova imagem.
Um dos principais comandos Docker é o run, que serve para executar uma imagem local como um contêiner. Na verdade, é criado uma camada de contêiner (mutável) sobre a imagem especificada. É possível que este comando venha a ser depreciado futuramente, pois ele foi adicionado como um subcomando do comando container: docker container run
. Ao executar o docker run, primeiro o Docker verifica se a imagem especificada já está disponível no computador local. Se não estiver, é feito o download automático de seu repositório e executado o contêiner. Abaixo, na linha 1, segue um exemplo que poderá testar agora. Ao executá-lo, o Docker irá baixar a imagem dockerfilemavenapi, versão 1.0, da conta smartiblogbr. Então, irá inicializar a imagem num contêiner chamado smarti, mapeando a porta 8081 do host para a porta 8080 do contêiner. Use o comando da linha 2 para verificar se o contêiner está ativo (up). Por fim, para testar a API Java rodando no contêiner, rode o comando da linha 3. Interessante, certo? Apenas uma linha de comando permitiu rodar todo um ambiente com Apache tomcat e uma aplicação REST Java em seu computador.
$ docker run --name smarti -d -p 8081:8080 smartiblogbr/dockerfilemavenapi:1.0 $ docker ps -a $ curl -X GET http://localhost:8081/smarti/
Com o comando container podemos listar os contêineres montados, inicializar, parar, executar comandos internos, comitar novas imagens, verificar logs, processos, recursos, etc. Vale deixar uma observação para o comando exec, pois ele permite executar comandos dentro dos contêineres. Por exemplo: você está rodando um banco de dados MariaDB e precisa criar um novo database. Basta executar o comando docker exec -it <nome_container> bash
. Ao executá-lo, você terá acesso ao shell do contêiner podendo se conectar ao client mysql e ter acesso a todas operações do banco de dados.
docker container run # cria uma camada de contêiner sobre a imagem e inicializa usando o comando especificado. docker container start # Executa container docker container stop # Para a execução do container docker container ls # Lista os containers docker container ls --all # Lista todos os containers docker container logs # Exibe os logs de execução do container docker container prune # Remove todos containers que não estão sendo executados docker container exec # Executa um comando num container em execução docker container commit # Cria uma nova imagem a partir de um container docker container cp # Copia files/folders entre o computador local e o container docker container inspect # Exibe informações detalhadas de um container docker container kill # Mata o processo de execução de forma imediata docker container restart # Reinicia um container docker container stats # Exibe os recursos utilizados do container docker container top # Exibe os processos em execução do container
É claro que Docker vai muito além disso, mas agora que já sabe os conceitos básicos sobre o que é Docker e alguns comandos, poderá ver este post para aprender como automatizar a criação e envio de imagens de seu ambiente com aplicações java integradas. 🙂