A tecnologia, em constante evolução, oferece ferramentas que proporcionam o desenvolvimento de softwares mais robustos, infraestrutura em nuvem, observabilidade na operação dos sistemas em ambientes produtivos e demais métodos que visam agilizar a entrega e gestão desses sistemas. O Docker faz parte desta evolução, facilitando o desenvolvimento, a implantação e a execução de aplicações em ambientes isolados.
Com o ele, você pode tanto gerenciar a sua infraestrutura quanto a sua aplicação da mesma forma, permitindo que as fases de implementação, testes e entrega de um software sejam simples, rápidas e sem interrupções, com ganho expressivo entre escrever o código e publicá-lo em ambiente produtivo.
Então, vamos conferir quais tópicos mostraremos neste post:
- O que é Docker e como funciona?
- O que é um Docker Container?
- Conheça a estrutura do Docker
- Docker e máquina virtual são a mesma coisa? Quais as diferenças?
- Quais as vantagens e desvantagens de usar o Docker?
- Como instalar o Docker?
- Comandos Docker: quais são e para que servem?
- Criando sua primeira aplicação com Docker: tutorial inicial!
O que é Docker e como funciona?
O Docker é uma plataforma open source (código aberto) para desenvolver, publicar e executar aplicativos. É uma ferramenta que permite a segregação entre a aplicação e a sua infraestrutura, o que faz com que a entrega do software seja rápida.
Desde o seu lançamento em 2013, a tecnologia oferecida por essa ferramenta proporciona a virtualização dos aplicativos utilizando o conceito de containers. Por ser uma plataforma relativamente recente, ela é constantemente atualizada pelas pessoas que a utilizam.
Além disso, é uma máquina virtual que permite a execução de imagens. A ideia é fornecer camadas de abstração, permitindo que um aplicativo seja executado de forma independente do sistema operacional da máquina. Isso é muito útil para os administradores de sistemas que gerenciam diversas aplicações simultaneamente.
Na arquitetura de microsserviços, é a plataforma mais utilizada porque permite que o software seja configurado usando um container local, cenário esse que equivale ao ambiente real de produção, mitigando possíveis erros ou fluxos de publicação (CI/CD) não mapeados.
Principais benefícios de usar Docker
- Desenvolver seus aplicativos e seus componentes usando containers;
- redução nos custos de licenças de software porque utiliza menos instâncias do sistema operacional para suas cargas de trabalho;
- o container permite a criação, testes e remoção de aplicação de forma isolada;
- é indicado para aplicações que exigem alta performance porque consomem menos recursos de máquina;
Dificuldades de iniciar o uso do Docker
- Aplicativos necessitam de um determinado tipo de sistema operacional. Para esse cenário, as máquinas virtuais são as mais indicadas;
- Para a aplicação monolítica, é necessário pequenas modificações na aplicação para que os benefícios em usar Docker sejam melhor aproveitados.
O que é um Docker Container?
Docker Container é uma forma de “empacotar” todo o código e as suas dependências de um aplicativo no formato padrão, respeitando a linguagem na qual o mesmo foi desenvolvido, permitindo a sua execução rápida, seja em um computador local, em máquinas virtuais ou em provedores de serviços em nuvem.
Ele pode ser executado em vários tipos de sistemas operacionais, como Windows, Linux e MAC.
Também, o Container trabalha de forma isolada, no que se trata de disco, memória, processamento e rede. Essa separação permite mais agilidade na criação, execução e orquestração dos containers, além de ambientes distintos poderem fazer uso do mesmo host, sem qualquer problema.
Conheça a estrutura do Docker
A estrutura do Docker compreende três principais grupos:
Docker cliente
- CLI: É uma ferramenta de linha de comando que permite a interação com o servidor docker daemon, por meio de comandos e subcomandos. Quando usamos os comandos próprios do Docker, por exemplo, docker run, o Docker client envia esse comando para o dockerd, que será responsável pela execução. A comunicação é realizada por meio de RESTful API, utilizando soquetes de domínio UNIX ou uma interface de rede;
- API remota: É a forma de interação com o docker daemon, disponibilizando ferramentas que permitem a criação e dimensionamento de aplicativos e soluções Docker com rapidez e facilidade. O Docker Engine API é uma RESTful API acessada por um HTTP client, como wget ou curl, ou a biblioteca HTTP que a maioria das linguagens de programação modernas disponibiliza.
Docker Host:
- Daemon: Responsável em gerenciar objetos do tipo Docker, como imagens, containers, redes e volumes, entre outros. Possui interação com as solicitações da API remota, também fornece comunicação com outros daemons para os gerenciar serviços do Docker;
- Engine: É uma tecnologia de código aberto para construir e armazenar seus aplicativos. Ele atua como um aplicativo cliente-servidor, nos seguintes cenários:
- um servidor de processo de longa duração para o servidor do Docker;
- APIs que são utilizadas para interagir com servidor do servidor do Docker;
- ferramentas de linhas de comando (CLI).
- Container: É uma instância executável de uma imagem. O Docker CLI ou a API remota permite a criação, inicialização, finalização, exclusão e movimentação do container. É possível também conectar um container a uma ou mais redes e criar uma nova imagem de container com base em seu estado atual;
- Imagem: É um modelo de leitura com instruções para a criação de um container. Para construir uma imagem, o arquivo do tipo Dockerfile é a forma mais simples e rápida para isso, em que as sintaxes de instruções definem as etapas necessárias para a criação e execução da imagem. Cada instrução em um Dockerfile cria uma camada na imagem. Quando o Dockerfile é alterado, a imagem é reconstruída apenas nas camadas que sofreram alteração, razão pela qual torna as imagens tão leves, pequenas e gerenciáveis, quando comparadas com outras tecnologias de virtualização;
- Docker compose: É uma ferramenta para definir e executar aplicativos Docker de vários containers. Com o Compose, podemos configurar os serviços do seu aplicativo utilizando um arquivo do tipo YAML. Dessa forma, podemos criar e iniciar todos os serviços de configuração do container utilizando apenas um comando;
- Docker Swarm: Consiste em vários hosts Docker que são executados para orquestrar containers em muitas máquinas. Oferece também recursos adicionais, como rede Docker entre máquinas, clustering e simplifica o gerenciamento em um grande ecossistema de container. Ele também pode ser executado em uma única máquina, para fins de estudo.
Docker Registry:
- Hub: É um serviço fornecido pelo Docker para compartilhar e localizar imagens de container. É o maior repositório do mundo de imagens de container, oferecendo uma variedade de fontes de conteúdo, projetos de código aberto e fornecedores de software independentes. Para conhecer mais sobre este serviço, acesse Docker Hub e construa o seu próprio repositório;
- Dockerfile: É um documento de texto que contém todos os comandos que uma pessoa usuária pode chamar na linha de comando para a criação de uma imagem Docker.
Docker e máquina virtual são a mesma coisa? Quais as diferenças?
Docker e máquina virtual não são a mesma coisa. Apesar de implementarem aplicativos em ambientes isolados do hardware, a principal diferença entre eles é o nível de isolamento.
Este é um exemplo de arquitetura Docker:
Este é um exemplo de arquitetura de máquina virtual:
Entenda as principais diferenças entre eles:
Docker
- Compartilha vários containers no mesmo kernel, permitindo que a pessoa usuária final empacote vários lotes de containers na mesma máquina com tempo de início quase instantâneo;
- os containers não precisam de um sistema operacional próprio, pois compartilham do mesmo entre si;
- o balanceamento de carga ocorre por meio de orquestradores de carga. Eles são responsáveis por iniciar ou parar automaticamente um ou mais containers, para gerenciar as alterações na carga e na disponibilidade;
- usa uma exibição isolada de um adaptador de rede virtual, fornecendo pouco menos de virtualização, pois o firewall do host é compartilhado entre todos os containers ativos no Docker.
Máquina virtual
- Fornece isolamento completo do sistema operacional para cada máquina virtual, incluindo o kernel, exigindo dessa forma mais recursos do sistema (CPU, memória e armazenamento);
- executa em praticamente qualquer sistema operacional;
- o balanceamento de carga ocorre para as máquinas virtuais em execução movendo-as para outros servidores em um cluster de failover;
- Usa adaptadores de rede virtuais.
Quais as vantagens e desvantagens de usar o Docker?
Vantagens
- Desenvolva seus aplicativos e seus componentes usando containers;
- Redução nos custos de licenças de software porque é necessário menos instâncias do sistema operacional para executar as mesmas cargas de trabalho;
- O container permite testes e destruição de forma isolada para cada aplicação;
- É perfeito para aplicações que exigem servidores de alta performance, assim como para aplicações de pequeno ou médio consumo de recursos de máquina;
- Permite a portabilidade de aplicativos.
Desvantagens
- A persistência de dados é um agravante para quem o utiliza, pois quando o container é desligado, os seus arquivos são apagados, não permitindo que os dados sejam reutilizados posteriormente;
- Não disponibiliza opção de armazenamento dos dados.
Como instalar o Docker?
Vamos apresentar, de forma detalhada, como instalar o Docker nos três principais sistemas operacionais:
Instalação Docker Linux
O Docker funciona perfeitamente com Ubuntu 20.04. Com as instruções de instalação a seguir, é uma aposta eficiente e segura para o manuseio de containers.
Pré-requisitos:
- configurar o servidor Ubuntu 20.04 conforme o Guia de configuração inicial de servidor do Ubuntu 20.04, incluindo um usuário sudo não root e um firewall;
- criar uma conta no Docker Hub, se você deseja criar suas imagens e enviá-las para a nuvem.
Passo 1 – Instalação do Docker
- Abra um terminal (use as teclas CTRL + ALT + T);
- atualize a lista existente de pacotes:
$ sudo apt update
- Instale alguns pacotes necessários que deixam o APT usar os pacotes pelo HTTPS:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
- inclua a chave GPG do repositório oficial do Docker. Isso serve para acrescentar mais segurança aos pacotes que serão baixados:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
- acrescente o repositório Docker às fontes do APT:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
- inclua o banco de dados do pacote com os pacotes do Docker do recém-adicionado no repositório:
$ sudo apt update
- verifique se a instalação será feita do repositório do Docker ao invés do repositório padrão do Ubuntu:
$ apt-cache policy docker-ce
- instale:
$ sudo apt install docker-ce
Passo 2 – Habilitar o Docker automaticamente no sistema
- No final da instalação, execute os comandos abaixo para habilitar o Docker automaticamente ao iniciar o seu sistema:
$ sudo systemctl enable docker
$ sudo systemctl start docker
- verifique se o Docker está funcionando corretamente:
$ sudo systemctl status docker
- valide a versão do Docker:
$ docker -v
Passo 3 – Como utilizar o Docker no Ubuntu 20.04
Com o Docker instalado corretamente em sua máquina, vamos realizar alguns testes:
- para encontrar uma imagem que possua um servidor LAMP, utilize o comando:
$ sudo docker search lamp
- a seguir, instale a imagem escolhida:
$ sudo docker pull nickistre/ubuntu-lamp-wordpress
- liste todas as imagens instaladas no Docker na sua máquina:
$ sudo docker images
Instalação Docker Windows
Para a instalação do Docker no sistema operacional Windows, é importante considerar os seguintes pré-requisitos:
Pré-requisitos:
- É indicado que a versão do sistema operacional seja a mais recente, Windows 10 de 64-bit. Esta versão possui subsistemas Linux, responsáveis pela execução do Docker;
- criar uma conta no Docker Hub, se você deseja criar suas imagens e enviá-las para o Docker Hub.
Passo 1 – Instalação do Docker
- Realize o download do Docker Desktop for Windows no site do docker hub;
- clique duas vezes no arquivo Docker Desktop Installer.exe para realizar a instalação;
- atente para selecionar a opção Enable Hyper-V Windows Features ou Install required Windows components for WSL 2 na página de configuração;
- siga as instruções do assistente de instalação até o final;
Caso a conta do usuário admin seja diferente da conta do usuário, é necessário adicioná-la no grupo de docker-users. Essa configuração deve ser realizada da seguinte forma:
- acesse o Painel de Controle;
- escolha a opção editar usuários e grupos locais;
- clique na pasta grupos;
- na opção docker-users, clique duas vezes;
- na janela de propriedades de docker-users, clique no botão adicionar;
- digite o nome do usuário admin, clique no botão OK para finalizar o processo;
- reinicie o computador para efetuar as alterações realizadas.
Passo 2 – Como inicializar o Docker no Windows
O Docker Desktop não se inicializa automaticamente após a instalação. Para começar a utilizá-lo, digite Docker na barra de tarefas e escolha a opção Docker Desktop.
Para validar se o Docker Desktop está funcionando corretamente, o ícone de baleia deverá estar visível na barra de status do terminal Windows.
Instalação Docker MAC
A instalação do Docker Desktop no Mac é prático e fácil, basta acessar o pacote Docker Toolbox e seguir as seguintes instruções:
Passo 1 – Download do pacote Docker
Pode ser realizado de duas formas:
- Via break cask: execute o comando a seguir;
$ brew cask install docker-toolbox
- Via Docker toolbox: instale manualmente acessando a página de download e baixando o instalador correspondente ao macOS.
Passo 2 – Instalação do Docker
- Clique duas vezes no instalador e será apresentada a seguinte tela:
- clique em Continue;
- marque todas as opções e clique em Install, conforme a seguinte imagem:
- informe o usuário e senha do computador para liberar a instalação dos softwares e continuar o processo;
- na próxima tela será apresentado as ferramentas que podem ser utilizadas para facilitar a utilização do Docker no macOS:
- clique em Continue;
- a próxima tela apresenta a finalização do processo de instalação:
- clique no botão Close, e a tela de instalação será fechada;
- para testar, execute o software chamado de Docker Quickstart Terminal, assim ele executará todo o processo para começar a utilizá-lo;
- No novo terminal que irá aparecer na tela do seu computador, executar o seguinte comando para realizar testes:
$ docker container run hello-world
Comandos Docker: quais são e para que servem?
O comando Docker consiste em uma cadeia de opções, comandos e argumentos. A sintaxe base segue este padrão:
$ docker [option] [command] [arguments]
Ele disponibiliza comandos comuns entre as pessoas desenvolvedoras e administradoras de servidores. Conheça os principais deles:
- Para visualizar todos os subcomandos disponíveis, digite:
$ docker
- Listar todas as imagens do Docker no seu sistema:
$ sudo docker images
- Listar apenas Ids numéricos de imagens disponíveis no seu sistema:
$ sudo docker images -q
- Puxar uma imagem do Docker:
$ sudo pull <id_do_container ou nome_da_imagem>
- Iniciar um Docker container:
$ sudo docker run <id_do_container ou nome_da_imagem>
- Parar um Docker container:
$ sudo docker stop <id_do_container ou nome_da_imagem>
- Visualizar o principal processo de um container:
$ sudo docker top <id_do_container ou nome_da_imagem>
- Visualizar as estatísticas de um container, tais como: utilização de CPU, uso de memória, entre outros:
$ sudo docker stats
- Finalizar um Docker container:
$ sudo docker kill <id_do_container ou nome_da_imagem>
A lista completa de subcomandos do Docker você pode conferir neste link.
Criando sua primeira aplicação com Docker: tutorial inicial!
Como já aprendemos a instalar o Docker e os seus principais comandos, vamos criar a nossa primeira aplicação com essa ferramenta.
A proposta será criar um projeto em Node.js. Para isso, o editor de código-fonte será o Visual Studio Code.
Caso você não possua as dependências do Node.js instaladas em sua máquina, o download está disponível em nodejs.org.
Com as instalações mencionadas acima realizadas, vamos executar as seguintes instruções:
- Abra o aplicativo Prompt de Comando:
- Clique em Executar como administrador, caso o seu usuário não esteja configurado com este tipo de permissão:
- Execute o comando que cria uma pasta com o nome de docker-intro:
C:\> mkdir docker-intro
- Execute o comando para abrir a pasta docker-intro:
C:\> cd docker-intro
- Execute o comando que irá criar um projeto Node.js:
C:\docker-intro> npm init -y
- Execute o comando para abrir o Visual Studio Code:
C:\docker-intro> code .
- No terminal do Visual Studio Code, execute o seguinte comando para adicionar a biblioteca express para a criação um servidor padrão Web:
PS C:\docker-intro> npm install express
- Adicione um novo arquivo chamado index.js, que será um servidor padrão Web e receberá as requisições pelo endereço http://localhost:3000. Para isso, acrescente a seguinte instrução:
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.send('Trybe!');
});
app.listen(3000, function () {
console.log('Servidor rodando na porta 3000!');
});
- Adicione um novo arquivo chamado package.json e adicionar a seguinte instrução:
{
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
- Adicione um novo arquivo chamado Dockerfile, responsável pela criação de imagem em Docker e inclua a seguinte instrução:
Comandos obrigatórios
Baixa a imagem do node com versão alpine (versão mais simplificada e leve)
FROM node:alpine
Estabelece o local onde o app ficará no container
Você também pode incluir em qualquer outro diretório
WORKDIR /app
Toda instrução que começa com package e termina com .json inserir na pasta /app
COPY package*.json ./
Executa npm install para adicionar as dependências e criar a pasta node_modules
RUN npm install
Toda a instrução que está no diretório do arquivo Dockerfile, mover para a pasta /usr/app do container
## Vamos ignorar a node_modules por isso criaremos um .dockerignore
COPY . .
## Container ficará ouvindo os acessos na porta 3000
EXPOSE 3000
## Não se repete no Dockerfile
## Executa o comando npm start para iniciar o script que que está no package.json
CMD npm start
- Adicione um novo arquivo chamado .dockerignore para ignorarmos arquivos ou pastas que não precisam ser copiadas para o container, adicionar a seguinte instrução:
node_modules
Agora que estamos com a nossa aplicação criada e o Dockerfile adicionado, vamos criar a nossa imagem no Docker.
- Conecte o Docker no Visual Studio Code, inserindo a sua credencial:
- Execute o comando a seguir para a criação de uma imagem a partir do Dockerfile com o nome de trybe/nodejs-image-demo:
PS C:\docker-intro> docker build -t trybe/nodejs-image-demo .
- Este será o resultado do Log de criação da imagem trybe/nodejs-image-demo:
- A opção IMAGES no Visual Studio Code, deverá apresentar a imagem que acabamos de criar:
Outra forma de validar a criação da imagem, é utilizar o comando:
PS C:\docker-intro> docker images
Com a imagem pronta, agora criaremos o container:
- Execute o seguinte comando:
PS C:\docker-intro> docker run -p 3000:3000 -d trybe/nodejs-image-demo
Antes de continuarmos, vamos explicar cada instrução do comando anterior:
- docker run: executa a criação de um container;
- -p 3000:3000: executa a liberação da porta do container para cada requisição externa pela porta 3000 e o container receberá essa requisição pela porta 3000;
- –d: significa que o container será executado em background;
- trybe/nodejs-image-demo: nome da imagem do container.
- O resultado pode ser conferido no Visual Studio Code:
- O comando a seguir lista os containers ativos no Docker:
PS C:\docker-intro> docker ps
- Para parar a execução de um container, digite o comando:
PS C:\docker-intro> docker stop <id_do_container>
- Para iniciar um determinado container, digite o comando:
PS C:\docker-intro> docker start <id_do_container>
- Para verificar os logs de um container, digite o comando:
PS C:\docker-intro> docker logs <id_do_container>
- Acesse o endereço http://localhost:3000 para validar a execução do container.
Assim, finalizamos a criação de uma imagem Docker e a inicialização de um container.
Espero que as suas dúvidas sobre todo o ecossistema do Docker tenham sido resolvidas.
Se você gostou deste conteúdo veja este post sobre VS Code: guia completo para instalar, usar e customizar e saiba como explorar ainda mais os recursos desse ambiente de desenvolvimento integrado!