Docker para a criação e gerenciamento de contêineres

O que é Docker?

editar

Docker é uma plataforma open-source criada para automatizar o deployment, scaling e gerenciamento de aplicações usando conteinerização. A ferramenta permite que desenvolvedores empacotem suas aplicações juntas de todas suas respectivas dependências em unidades padronizadas chamadas de contêineres, garantindo que o software roda uniformemente em vários ambientes.

A engine do Docker funciona como uma aplicação cliente-servidor, com:

  • Um servidor rodando um processo daemon dockerd
  • APIs que especificam interfaces que programas podem usar para instruir e conversar com o daemon do Docker
  • Uma interface de linha de comando (CLI) cliente chamada de docker[1]

O que são contêineres?

editar

Contêineres são pacotes leves, independentes e executáveis que incluem tudo aquilo que a aplicação precisará para ser executada: código, ferramentas do sistema, bibliotecas, configurações, etc. Diferentemente de máquinas virtuais, contêineres compartilham o kernel do sistema host e não precisam de um sistema operacional inteiro para cada aplicação, tornando-os mais eficientes e velozes para iniciar.

Porque usar Docker?

editar
  • Portabilidade: Contêineres do Docker podem ser rodados em qualquer sistema que suporta Docker, garantindo ambientes consistentes desde o desenvolvimento até a produção.
  • Eficiência: Contêineres são mais eficientes em recurso do que as tradicionais máquinas virtuais, uma vez que compartilham o kernel do sistema operacional host.
  • Isolamento: As aplicações em Docker são executadas de maneira isolada, o que reduz possíveis conflitos e garante mais segurança.
  • Escalabilidade: Docker torna escalar aplicações horizontalmente mais fácil ao adicionar mais contêineres.

Principais conceitos de Docker

editar

Imagens

editar

Uma imagem é um template imutável que é utilizado para criar contêineres. Imagens são criadas a partir de uma série de camadas, cada uma contendo um conjunto de mudanças no sistema de arquivo, como adições, deleções e modificações.

Contêineres

editar

Um contêiner é uma instância executável de uma imagem. É possível criá-los, iniciá-los, pará-los, movê-los ou deletá-los utilizando a API do Docker ou sua interface de linha de comando.

Dockerfile

editar

Um Dockerfile é um documento de texto que contém todos os comandos que o usuário pode chamar para gerar uma imagem. Utilizando o comando docker build, é possível que usuários criem uma build automática que executa diversas instruções em sequência.

Docker Hub

editar

Docker Hub é um repositório baseado em nuvem onde usuários de Docker criam, testam, armazenam e distribuem imagens.[2]

Docker Volumes

editar

Volumes são usados para um armazenamento de dados persistente e para compartilhar dados entre contêineres ou entre um contêiner o sistema host.

Instalação do Docker

editar

Em sistemas Linux:

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Verificando se a instalação foi bem-sucedida

editar
sudo docker run hello-world

Comandos básicos de Docker

editar
  • Listar os comandos de CLI do Docker
    docker
    
  • Listar informações sobre comandos específicos do Docker
    docker [comando] --help
    
  • Executar uma imagem
    docker run [imagem]
    
  • Listar os contêineres em execução
    docker ps
    
  • Listar todos os contêineres, incluindo aqueles executando e aqueles interrompidos
    docker ps -a
    
  • Interromper um contêiner em execução
    docker stop [id_conteiner]
    
  • Remover um contêiner
    docker rm [id_conteiner]
    
  • Listar imagens
    docker images
    
  • Remover uma image
    docker rmi [id_imagem]
    

Criando um Dockerfile

editar

Um Dockerfile automatiza o processo de criação de imagens. Um exemplo para a criação de uma aplicação em Node.js simples ficaria da seguinte forma:

# Usar uma imagem oficial do Node como imagem base
FROM node:14

# Definir o diretório de trabalho
WORKDIR /usr/src/app

# Copiar package.json e package-lock.json
COPY package*.json ./

# Instalar dependências
RUN npm install

# Copiar o restante do código da aplicação
COPY . .

# Expor a porta da aplicação
EXPOSE 8080

# Definir o comando para executar a aplicação
CMD [ "node", "app.js" ]

Buildando a imagem

editar
docker build -t my-node-app .

Executando o contêiner

editar
docker run -p 8080:8080 -d my-node-app

O comando acima mapeia a porta 8080 dentro do contêiner para a porta 8080 da máquina host.

Gerenciamento de contêineres

editar
  • Iniciando um contêiner
    docker start [id_conteiner]
    
  • Interrompendo um contêiner
    docker stop [id_conteiner]
    
  • Observando os detalhes de um contêiner
    docker inspect [id_conteiner]
    
  • Observando os logs de um contêiner
    docker logs [id_conteiner]
    
  • Removendo um contêiner
    docker rm [id_conteiner]
    

Tópicos Avançados de Docker

editar

Docker Compose

editar

Docker Compose é uma ferramenta usada para definir e executar aplicações de Docker com diversos contêineres. Usando o comando Compose, é possível utilizar um arquivo do tipo YAML para configurar os serviços da aplicação.

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/usr/src/app
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: example

Executando Docker Compose

editar

Para iniciar a aplicação, utilize:

docker-compose up

Docker Swarm

editar

É a ferramenta que oferece uma plataforma para gerenciamento de clusters, transformando uma seleção de hosts de Docker em um único host virtual.

Iniciando um Swarm

editar
docker swarm init

Boas práticas em Docker

editar
  • Utilizar .dockerignore: Similar ao .gitignore, esse arquivo informa ao Docker quais são os arquivos e diretórios que devem ser ignorados ao construir uma imagem
  • Rebuildar suas imagens com frequência: É importante rebuildar imagens com uma boa frequência, a fim de garantir que elas estarão atualizadas e seguras, com suas dependências em versões recentes.
  • Criar contêineres efêmeros: A imagem definida pelo Dockerfile deve, no geral, gerar contêineres que são os mais efêmeros possível. Isso significa que os contêineres devem pode ser interrompidos e destruídos, e depois serem reconstruídos e substituídos com o mínimo de configurações e setup necessários.

Bibliografia

editar
  1. Documentação do Docker https://docs.docker.com/
  2. Docker Hub https://hub.docker.com/